先看如下代码
void test02()
{
int a = 10;
int b = 0;
int c = a / b;
}
当你在main()中调用test02()时,很明显会出现如下错误
int main(){
test02();
system("pause");
return EXIT_SUCCESS;
}
因为除数不能为0,所以执行a/b时就会引发错误,然后程序就自动停止了。有无错误就停止,这到没什么,关键是这种用户体验不是很好,你想一下,当程序运行好好的时候,遇到错误,就弹出这么一个窗口,然后程序就终止了,这对用户体验很不好,为了解决这种问题,C++中引入了异常处理机制,让程序猿能够在代码里处理这种错误。明白了这点之后,我们应该在程序里如何集成这种异常机制呢?
需要try()catch(){} 和throw配合,这是一套操作,请看如下代码
int main(){
try
{
test02();
}
catch (...)
{
cout << "main函数中 其他类型异常捕获" << endl;
}
system("pause");
return EXIT_SUCCESS;
}
try{ }里面将可能要出错的代码写到这里面来,当里面的代码出错后,那么就会执行catch{ }中的代码。
这时候,你继续编译,然后运行,你会发现它又弹出了下面的错误,好像try...catch并没有用
实际上我们的try...catch没有错,但想要起作用,还需要throw关键字的配合,test02()代码改造如下
void test02()
{
int a = 10;
int b = 0;
if (b == 0){
throw 1;
}
int c = a / b;
}
代码执行后,会打印如下内容
当b == 0 时,就会执行throw 1,throw 就表示抛出一个错误,然后这个错误由test02所在的catch中处理。这里的1,是我随便写的返回数据类型,该类型会和catch 括号中的类型进行匹配,然后执行对应的代码块中的内容。比如说,我们例子中catch只有1个
(...)这表示任何类型,也就是说,不管你throw 后面跟什么类型,都可以在这里匹配到。
那么我再将try...catch改造为如下
int main(){
try
{
test02();
}
catch (int) //如果异常都没有处理
{
cout << "main 函数中 int类型异常捕获" << endl;
}
catch (...)
{
cout << "main函数中 其他类型异常捕获" << endl;
}
system("pause");
return EXIT_SUCCESS;
}
代码执行后,将会打印如下
main 函数中 int类型异常捕获
因为test02()中throw的数据类型是int ,因此它会优先匹配到catch()中的int ,然后执行对应代码块中的内容