C++异常except

#include "stdafx.h"
#include <stdexcept>
using namespace std;

int SafeDivide(int num,int den)
{
	if(den==0)
		throw invalid_argument("除数为零了");
	return num/den;
}

int _tmain(int argc, _TCHAR* argv[])
{

	try	{

		cout<<SafeDivide(15,5)<<endl;
		cout<<SafeDivide(15,0)<<endl;
		cout<<SafeDivide(15,3)<<endl;

	} catch(const invalid_argument &e) {     //参数异常
		cout<<e.what()<<endl;        

	} catch(const runtime_error &e) {
		cout<<e.what()<<endl;               //运行异常

      } catch(const exception & e) {
			cout<<e.what()<<endl;           //其他异常 

	} catch(...) {
		cout<<"other error"<<endl;          //其他异常      
	}
}

         throw是C++关键字,这是抛出异常的唯一方法。throw行的invalid_argument()部分意味着构建invalid_argument类型的新对象并准备将其抛出。这是C++标准库提供的标准异常。

         标准库中的所有异常构成一个层次结构。该层次结构中的每个类都支持what()方法,该方法返回一个描述异常的const char *字符串。该字符串在异常的构造函数中提供。

         throw关键字可以用于随时随地抛出异常。

        异常是这样一种方法:“尝试”执行一块代码,并且用另一块代码响应可能发生的任何错误。catch语句响应任何被try块抛出的exception类型异常,并输出错误信息。如果try块结束时没有抛出异常,catch块将被忽略。

        可以将try/catch块当做if语句。如果try块中抛出异常,就会执行catch块,否则就忽略catch块。

#include "stdafx.h"
#include <stdexcept>
using namespace std;

int SafeDivide(int num,int den)
{
	if(den==0)
		throw invalid_argument("除数为零了");
	return num/den;
}

int _tmain(int argc, _TCHAR* argv[])
{

	try	{

		cout<<SafeDivide(15,5)<<endl;
		cout<<SafeDivide(15,0)<<endl;
		cout<<SafeDivide(15,3)<<endl;	

	} catch(const exception & e) {
			cout<<e.what()<<endl;          //所有异常 
	}
}

       exception引用的catch语句可与exception的任何派生类匹配,包括invalid_argument和runtime_error。捕获的异常在异常层次结构中的层次结构越高,错误处理就越不具有针对性。通常应该尽可能针对性的捕获异常。

      当利用多态捕获异常时,一定要按引用捕获。如果按值捕获异常,就可能发生截断,在此情况下将会丢失对象的信息。

猜你喜欢

转载自blog.csdn.net/sichuanpb/article/details/82964101