a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 204|回复: 4

[Visual Basic] 2011年计算机等考二级VB辅导知识技巧总结(27)

[复制链接]
发表于 2012-7-31 22:10:12 | 显示全部楼层 |阅读模式
用printer对象打印表格  这两天我写了一个测试c++异常处理机制的例子,感觉有很好的示范作用,在此贴出来,给c++异常处理的初学者入门。本文后附有c++异常的知识普及,有兴趣者也可以看看。# g' W) F) k" [1 W+ W' |
  下面的代码直接贴到你的console工程中,可以运行调试看看效果,并分析c++的异常机制。
. ^& R  A9 ?3 o  #include "stdafx.h"
0 @- W; s- M7 o  #include, L1 h; c1 C2 H: W5 k/ D) O4 k
  #include1 ^1 ^/ F$ O1 S0 P5 a2 e( W! t" h4 k
  #include9 W# u. i6 K  r% [
  // 内存泄露检测机制
) d* o2 Q: c2 {  p) d  #define _CRTDBG_MAP_ALLOC
5 A7 B$ W% O4 F+ r! h9 |  #ifdef _DEBUG) k  ]' H/ {* W/ w2 k$ ?4 S
  #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
, N. H& ~3 H- k; M& r) y  #endif' |* X7 s' A/ j
  // 自定义异常类
% \- P- m% P7 ]/ ]+ t  class MyExcepction! h' O, h6 B3 D& `8 N
  {
& t* A! `# H/ S+ O1 E  public:$ W5 e* `, y! x
  // 构造函数,参数为错误代码( Q4 R: {1 E+ z9 f
  MyExcepction(int errorId)
( _1 N: f) n' z  {! m$ j. S. M/ q+ U% B& m
  // 输出构造函数被调用信息
( A# Y( e% d/ d! E( E% V: p$ b7 f1 P, x  E' N' x
  std::cout
回复

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:13 | 显示全部楼层

2011年计算机等考二级VB辅导知识技巧总结(27)

 std::cout
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:14 | 显示全部楼层

2011年计算机等考二级VB辅导知识技巧总结(27)

  {
6 j1 O7 `- p$ s; m) P- i+ ~  // 不提倡这样的抛出方法$ J! y2 R* x2 D$ S2 W6 V
  // 这样做的话,如果catch( MyExcepction* pMyExcepction)中不执行delete操作则会发生内存泄露
# f& l/ `- P5 P; L* U  // 由catch( MyExcepction* pMyExcepction) 捕获
$ g5 _! v0 T6 A. [6 d  MyExcepction * pMyStru = new MyExcepction(120);
+ D# |3 M* I4 B8 W6 R  O  throw pMyStru;4 a, K2 }" u3 ^4 j- @3 p* Y
  }
# `! B9 d2 r6 Q, ^  else* u# X2 p: |+ s* d$ w! P3 o5 Q
  {  _2 ^  I) O5 B. K. O) B
  // 直接创建新对象抛出
, p4 I5 @4 A: O& x6 q7 f- P- m* G  // 相当于创建了临时的对象传递给了catch语句  E$ R+ E" k  I) P3 Q% p
  // 由catch接收时通过拷贝构造函数再次创建临时对象接收传递过去的对象
5 m$ u) q7 |8 s$ p+ s% k/ }- i  // throw结束后两次创建的临时对象会被析构掉8 z8 `8 [) h7 p0 j" U$ Q
  throw MyExcepction(throwErrorCode);
6 Y: g& H1 D2 [( l; _4 ~1 T  }
) {/ P  h$ t# A) T5 P) c  }/ f8 \1 {# e( z1 h7 ]4 o
  catch( MyExcepction* pMyExcepction)
8 W# Q% t) W/ {: q; H0 T, h$ B  {$ H0 `+ g0 M) `, F6 A, r
  // 输出本语句被执行信息
% l% l$ A( \  Q9 {$ D
6 h! `0 b  v7 K2 f! |& [8 i  std::cout
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:15 | 显示全部楼层

2011年计算机等考二级VB辅导知识技巧总结(27)

知识点: c++异常机制  一、 概述) m5 |  U* i2 i0 |8 ^7 t/ P
  C++自身有着非常强的纠错能力,发展到如今,已经建立了比较完善的异常处理机制。C++的异常情况无非两种,一种是语法错误,即程序中出现了错误的语句,函数,结构和类,致使编译程序无法进行。另一种是运行时发生的错误,一般与算法有关。9 B3 j5 d) p) ~- \: c
  关于语法错误,不必多说,写代码时心细一点就可以解决。C++编译器的报错机制可以让我们轻松地解决这些错误。6 |+ R  b" y! h# K4 T
  第二种是运行时的错误,常见的有文件打开失败、数组下标溢出、系统内存不足等等。而一旦出现这些问题,引发算法失效、程序运行时无故停止等故障也是常有的。这就要求我们在设计软件算法时要全面。比如针对文件打开失败的情况,保护的方法有很多种,最简单的就是使用“return”命令,告诉上层调用者函数执行失败;另外一种处理策略就是利用c++的异常机制,抛出异常。" E; C8 B; B( R# p, e1 T% H* j
  二、c++异常处理机制
" j; k! U  |) ]0 k8 I( h, z  I4 O  C++异常处理机制是一个用来有效地处理运行错误的非常强大且灵活的工具,它提供了更多的弹性、安全性和稳固性,克服了传统方法所带来的问题.0 c7 A* ?/ K) H9 F/ `
  异常的抛出和处理主要使用了以下三个关键字: try、 throw 、 catch 。
' J9 G" z5 w+ ~" P+ ]6 D1 ?$ a' S# p  抛出异常即检测是否产生异常,在C++中,其采用throw语句来实现,如果检测到产生异常,则抛出异常。该语句的格式为:
1 e1 H7 P: U" x& M  throw 表达式;7 o. c* H3 O! R
  如果在try语句块的程序段中(包括在其中调用的函数)发现了异常,且抛弃了该异常,则这个异常就可以被try语句块后的某个catch语句所捕获并处理,捕获和处理的条件是被抛弃的异常的类型与catch语句的异常类型相匹配。由于C++使用数据类型来区分不同的异常,因此在判断异常时,throw语句中的表达式的值就没有实际意义,而表达式的类型就特别重要。$ M3 M3 M8 _5 b3 B" L! r4 f
  try-catch语句形式如下 :
( E3 d2 \) o" O" F  try, K9 E) M7 F8 g4 b! e; G% K
  {
6 u* t5 W  S) V! x1 x3 [' r0 h  包含可能抛出异常的语句;
5 U* D5 j, J7 z& v  }
: @- {9 Q0 ?9 G; ?/ n  catch(类型名 [形参名]) // 捕获特定类型的异常
& G* r2 Y! a2 R4 \* B. h  {  \7 e( Y$ w, S3 B5 E& k
  }
& s6 V1 X) h1 l  catch(类型名 [形参名]) // 捕获特定类型的异常
% y) W: d; p% Y0 N# c  {
5 I) T. Q. w' S, F" K: Q' a+ q9 M  }
% m6 r/ k# M( z$ k! n  catch(...) // 三个点则表示捕获所有类型的异常- t& S9 Z2 R1 F. }) I# ~  {& P* N
  {
) y0 t3 ]0 g# U/ [1 H) A+ A  }* J; r: H; |5 }1 w# F: k6 X
  【范例1】处理除数为0的异常。该范例将上述除数为0的异常可以用try/catch语句来捕获异常,并使用throw语句来抛出异常,从而实现异常处理,实现代码如代码清单1-1所示。
8 ]. L* ]2 }* X, W  // 代码清单1-1
1 [+ z' l( s# F- D& t  1 #include //包含头文件2 k9 A( Y+ n+ j$ m
  2 #include# M5 l& p  [3 ^; }
  3 double fuc(double x, double y) //定义函数9 ^8 E7 B5 ]/ w1 ], [4 X$ r4 V
  4 {
( d1 a' J, O1 F% H" D, r- w. Q  5 if(y==0)( B! E+ V; g% ~) u, L
  6 {
! X* _  m) b1 t' m" N- h- P5 T. |  7 throw y; //除数为0,抛出异常6 u- E5 O- J  T6 @2 O4 f) _+ j
  8 }& E& l. Z& E4 H! n
  9 return x/y; //否则返回两个数的商
8 @8 p2 c$ b6 V  10 }
( J8 w; Y' l3 T% {. ]* h5 ]  11 void main()
9 a7 P, d/ x0 w% E! i& b  12 {
2 Y4 P0 r7 l1 n  13 double res;
. l4 h; _  O6 }( }  14 try //定义异常
4 V: L+ Q( l7 C$ j  15 {
# d) \8 `. l; d9 e/ x  16 res=fuc(2,3);9 v: `( T! R( q2 t
- M# \' }* k. {7 ^
  17 cout
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-7-31 22:10:16 | 显示全部楼层

2011年计算机等考二级VB辅导知识技巧总结(27)

 三、异常的接口声明  为了加强程序的可读性,使函数的用户能够方便地知道所使用的函数会抛出哪些异常,可以在函数的声明中列出这个函数可能抛出的所有异常类型,例如:
7 V) X5 A3 h* ^6 E  void fun() throw( A,B,C,D);这表明函数fun()可能并且只可能抛出类型(A,B,C,D)及其子类型的异常。5 _7 B+ d7 i& I7 M7 j- E) v( ^6 D
  如果在函数的声明中没有包括异常的接口声明,则此函数可以抛出任何类型的异常,例如:void fun();
- `* r/ ^7 c" N. C  一个不会抛出任何类型异常的函数可以进行如下形式的声明:, f  z) f; O9 _9 Y( w$ l7 p
  void fun() thow();
. N5 z. ^- V) b# Z5 I3 E" Q5 s  五、异常处理中需要注意的问题1 S/ D, u6 g8 _0 _* q5 |
  1. 如果抛出的异常一直没有函数捕获(catch),则会一直上传到c++运行系统那里,导致整个程序的终止
% M: m4 _* A2 n' ~7 ~  2. 一般在异常抛出后资源可以正常被释放,但注意如果在类的构造函数中抛出异常,系统是不会调用它的析构函数的,处理方法是:如果在构造函数中要抛出异常,则在抛出前要记得删除申请的资源。5 d8 q& J4 p2 ^) _, l
  3. 异常处理仅仅通过类型而不是通过值来匹配的,所以catch块的参数可以没有参数名称,只需要参数类型。" ~$ ]9 g0 a0 q& m0 e0 N
  4. 函数原型中的异常说明要与实现中的异常说明一致,否则容易引起异常冲突。
- P$ o" e9 t! [8 e4 N4 m  5. 应该在throw语句后写上异常对象时,throw先通过Copy构造函数构造一个新对象,再把该新对象传递给 catch.
& t# X& L: c7 T0 @2 b4 w  那么当异常抛出后新对象如何释放?* h* n. ?- V- h- U
  异常处理机制保证:异常抛出的新对象并非创建在函数栈上,而是创建在专用的异常栈上,因此它才可以跨接多个函数而传递到上层,否则在栈清空的过程中就会被销毁。所有从try到throw语句之间构造起来的对象的析构函数将被自动调用。但如果一直上溯到main函数后还没有找到匹配的catch 块,那么系统调用terminate()终止整个程序,这种情况下不能保证所有局部对象会被正确地销毁。1 T1 W) {6 ?# {$ k" P+ w& u- x
  6. catch块的参数推荐采用地址传递而不是值传递,不仅可以提高效率,还可以利用对象的多态性。另外,派生类的异常扑获要放到父类异常扑获的前面,否则,派生类的异常无法被扑获。
, o8 d6 d. \7 A0 Y+ n  7. 编写异常说明时,要确保派生类成员函数的异常说明和基类成员函数的异常说明一致,即派生类改写的虚函数的异常说明至少要和对应的基类虚函数的异常说明相同,甚至更加严格,更特殊。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-18 08:06 , Processed in 0.325724 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表