欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

essential c++ 第七章 异常处理

程序员文章站 2022-07-13 21:45:07
...

c++异常处理涉及到三个关键字:try、catch、throw

  • throw: 当问题出现时,程序会抛出一个异常。这是通过使用 throw 关键字来完成的。
  • catch: 在您想要处理问题的地方,通过异常处理程序捕获异常。catch 关键字用于捕获异常。
  • try: try 块中的代码标识将被**的特定异常。它后面通常跟着一个或多个 catch 块。

1.抛出异常

异常处理机制包括两个部分:

1.异常的鉴定与发出

2.异常的处理方式

inline void Triangular_iterator::
check_integrity(){
	if(_index>=Triangular::_max_elems)
		throw iterator_overflow(_index,Triangular::_max_elems)
}

最简单的异常对象可以是数字或字符串

throw 42;
throw "yichang";

大部分时候,被抛出的异常都属于特定的异常类

class iterator_overflow{
	public:
		iterator_overflow(int index,int max):_index(index),_max(max){
		}
		int index(){
			return _index;
		}
		int max(){
			return _max;
		}
		void what_happened(ostream &os=cerr){
			os << "internal error:current index";
		}
		private:
			int _index;
			int _max;
};

2.捕获异常

使用catch来捕获抛出的异常

catch:包括小括号内的类型或对象、大括号内的一组语句

extern void log_message(const char *);
extern string err_message[];
extern ostream log_file;

bool some_function(){
	bool status=true;
	catch(int errno){
		log_message(err_message[errno]);
		status =false;
	}
	catch(const char *str){
		log_message(str);
		status =false;
	}
	catch(iterator_overflow &iof){
		iof.what_happened(log_file);
		status =false;
	}
	return status;
}

异常对象的类型会被拿来逐一和每个catch子句对比,如果类型符合,那么该catch就会被执行

3.提炼异常

catch语句应该和try一起。表示如果try中有任何异常发生,那么便由接下来的catch子句加以处理

#include <iostream>
using namespace std;
 
double division(int a, int b)
{
   if( b == 0 )
   {
      throw "Division by zero condition!";
   }
   return (a/b);
}
 
int main ()
{
   int x = 50;
   int y = 0;
   double z = 0;
 
   try {
     z = division(x, y);
     cout << z << endl;
   }catch (const char* msg) {
     cerr << msg << endl;
   }
 
   return 0;
}

在上面的代码中,在我们执行try语句块中的语句时,抛出了异常,所以立即开始执行catch中的语句,因为throw抛出的异常是字符串,因此catch中的类型应该是char*,来保证和throw抛出的一致。

4.局部资源管理