如何处理一个异常,取决于该异常的类型。这与重载函数的参数匹配有些相似,但又有所不同。
重载函数可能有多个参数,而捕捉异常时的参数只有一个;其次,处理异常之后不会像调用函数那样返回异常的发生处。异常处理严重影响语句的运行顺序。
当有多个catch语句时,所发生的异常会按顺序与之匹配,一旦匹配成功就进入异常处理,不再与剩余的catch语句继续配对。
在异常处理中,有一种方法可以与所有的异常匹配,那就是使用catch (…)。
除了系统能够抛出异常外,用户也可以抛出异常。用户抛出的异常也可以被捕捉并处理。
抛出异常使用throw语句,它可以出现在任何函数体内。其语法格式为:
throw 表达式;
如果throw抛出的异常没有被捕捉处理,则也会导致程序退出。
try语句括起一个测试块,其中含有可能出错的语句。如果有异常发生,则会抛出特定类型的异常。
每一个catch语句是一个异常处理器,相当于一个带参数的函数,功能是对指定异常类型进行处理。
一旦一个异常信号被抛出,那么与这个信号有相同类型参数的catch子句会捕获这个异常并处理。处理完成后整个异常处理流程结束。
Exceptions report errors found at run time. If an error can be found at compile time, it is usually preferable to do so. That’s what much of the type system and the facilities for specifying the interfaces to user-defined types are for.
You use try-catch blocks to establish exception handlers for a block of code. Within the try block, you place code that might throw an exception. Within the catch block, you specify a handler for each exception type you can handle.
传统的异常处理:就地处理
C++的新异常处理特性:
异常处理将检测发现错误的代码与处理错误的代码分开来。程序员的工作也可做相应分工(例如,库函数程序员负责检测异常,而调用库函数的另一程序员则负责捕获与处理异常)。
使程序员可以删除程序执行“主线条”中的错误处理代码,从而提高程序的可读性和可维护性。
一个函数抛出异常,它必须假定该异常能被捕获和处理。异常捕获机制使得C++可以把问题集中在一处解决。
catch处理器定义自己的范围。catch在括号中指定要捕获的对象类型。catch处理器中的参数可以命名也可以无名。如果是命名参数,则可以在处理器中引用这个参数。如果是无名参数(只指定匹配抛出对象类型的类型),则信息不从抛出点传递到处理器中,只是把控制从抛出点转到处理器中.许多异常都可以这样。
catch (…) 捕获任意类型的异常。
异常捕获原理
如果一个异常信号被抛出,异常处理器中第一个参数与异常抛出对象相匹配的函数将捕获该异常信号,然后进入相应的catch语句,执行异常处理程序。
异常接口声明
可以在函数的声明中列出这个函数可能抛掷的所有异常类型。
例如:
void fun() throw(A,B,C,D);
若无异常接口声明,则此函数可以抛掷任何类型的异常。
不抛掷任何类型异常的函数声明如下:
void fun() throw();
C++编译器通过throw 来产生对象,C++编译器再执行对应的catch分支,相当于一个函数调用,把实参传递给形参。
也有点类似于switch语句,throw定义值类型,catch类似case分句
Catch parameters work just like function parameters, with the parameter being available within the subsequent catch block. Exceptions of fundamental types can be caught by value, but exceptions of non-fundamental types should be caught by const reference to avoid making an unnecessary copy.
try blocks catch exceptions not only from statements within the try block, but also from functions that are called within the try block.
gives us a chance to print an error of our choosing and then save the user’s state before exiting.