C++语言程序设计 C++语言程序设计 第十一章 异常处理 C++语言程序设计
“ 目录 C++语言程序设计 基本知识 编程技能 刨根问底 用户自定义类的对象传递异常 异常和异常处理 C++异常处理机制 自定义exception类的派生类对象传递异常 异常和异常处理 C++异常处理机制 用类对象传递异常 异常处理中的退栈和对象析构 C++语言程序设计
编程技能 b C++语言程序设计
(一)用户自定义类的对象传递异常 template <class T, int i> //类模板定义 class MyStack #include <iostream> using namespace std; class StackOverflowException //栈满异常类 {public: StackOverflowException() {} ~StackOverflowException() {} void getMessage() { cout << "异常:栈满,不能入栈。" << endl; } }; class StackEmptyException //栈空异常类 StackEmptyException() {} ~StackEmptyException() {} { cout << "异常:栈空,不能出栈。" << endl; template <class T, int i> //类模板定义 class MyStack { T StackBuffer[i]; int size; int top; public: MyStack( void ) : size( i ) {top = i;}; void push( const T item ); T pop( void ); };
(一)用户自定义类的对象传递异常 C++语言程序设计 void main() //类模板测试程序 { MyStack<int,5> ss; for(int i=0;i<10;i++) {try {if(i%3)cout<<ss.pop()<<endl; else ss.push(i); } catch (StackOverflowException &e) { e.getMessage(); catch (StackEmptyException &e) cout<<"Bye\n"; template <class T, int i> //push成员函数定义 void MyStack< T, i >::push( const T item ) { if( top >0 ) StackBuffer[--top] = item; else throw StackOverflowException(); //抛掷对象异常 return; } template <class T, int i> //pop成员函数定义 T MyStack< T, i >::pop( void ) { if( top < i ) return StackBuffer[top++]; throw StackEmptyException(); //抛掷另一个对象异常 程序执行的结果是: 异常:栈空不能出栈。 3 6 Bye C++语言程序设计
(二)自定义exception类的派生类对象传递异常 定义一个简单的数组类。在数组类中重载“[ ]”运算符,目的是对于数组元素的下标进行检测。如果发现数组元素下标越界,就抛掷一个对象来传递异常。并且要求处理异常时可以显示越界的下标值。 我们使用exception类的对象来传递对象。但是,直接使用exception类对象还是不能满足例题的要求。因为不能传递越界的下标值。 为此,可以定义一个exception类的派生类ArrayOverflow。其中包含一个数据成员k。在构造ArrayOverflow类对象时,用越界的下标值初始化这个数据k。在catch块中捕获到这个对象后,可以设法显示对象的k值。 C++语言程序设计
(二)自定义exception类的派生类对象传递异常 #include <iostream> #include <exception> using namespace std; class ArrayOverflow : public exception //exception类的派生类 {public: ArrayOverflow::ArrayOverflow(int i) : exception( "数组越界异常!\n" ) {k=i;} const char * what() //重新定义的what()函数 {cout<<"数组下标"<<k<<"越界\n"; return exception::what(); } private: int k; }; class MyArray //数组类的定义 { int *p; //数组首地址 int sz; //数组大小 public: MyArray(int s) { p=new int [s]; sz=s; } //构造函数 ~MyArray( ) { delete [ ] p ; } int size( ) { return sz; } int& operator[ ] (int i);//重载[]运算符的原型 }; C++语言程序设计
(二)自定义exception类的派生类对象传递异常 int& MyArray:: operator[ ] (int i) //重载[]运算符 {if(i>=0 && i<sz) return p[i]; throw ArrayOverflow( i ); } void f(MyArray &v); void main() {MyArray A(10); f(A); void f( MyArray& v ) { for(int i=0;i<3;i++) {try { if(i!=1) {v[i]=i; cout<<v[i]<<endl;} else v[v.size( )+10]=10; } catch( ArrayOverflow &r ) {cout<<r.what(); } //for循环结束 程序执行的结果是: 数组下标20越界 数组越界异常! 2 C++语言程序设计