#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。捕获的异常在异常层次结构中的层次结构越高,错误处理就越不具有针对性。通常应该尽可能针对性的捕获异常。
当利用多态捕获异常时,一定要按引用捕获。如果按值捕获异常,就可能发生截断,在此情况下将会丢失对象的信息。