Try和异常处理
C++中异常处理包括三个
throw expressions,用来表示遇到了不能处理的异常,throw会抛出一个异常(a throw raises an exception)
try blocks,用来尝试"处理"异常情况
exception class,用来传递信息
Throw Expression
throw后跟一个表达式,这个表达式决定了抛出的异常的类型。
throw runtime_error("...");//抛出一个runtime_error异常
runtime_error是定义在stdexcept中的标准库异常类型,必须有一个string来初始化。
当然我们也可以抛出其他的error,见后面的standard exception
Try Block
语法如下:
try(
program-statements
}catch(exception-declaration){
handler-statements
}catch(exception-declaration){
handler-statements
}//...
几点说明:
每个handler-statements执行完后,会跳出整个try block,而不像switch中的case那样会依次执行,所以不需要break在结尾。
一个例子:
while(cin>>item1>>item2){
try{将item1和item2相加,如果出错,则throw一个runtime_error}
catch(runtime_error err){
cout<<err.what()<<"\nTry Again? y or n"<<endl;
char c;
cin>>c;
if(!cin || c=='n')
break;//注意这个break会直接跳出while循环
}
}
注意:写出安全处理代码(exception safe code)是非常困难的!!C++ Primer说超出了本书的范围。
Standard Exception
stdexcept头文件中定义的标准异常类
exception: the most general kind of problem
runtime_error: problem that can be detected only at run time
range_error: result generated outside the range of values that are meaningful
overflow_error: computation that overflowed
underflow_error: computation that underflowed
logic_error: error int the logic of the program
domain_error: argument for which no result exists
invalid_argument: inappropriate argument
length_error: attempt to create an object larger than the maximum size for that type
out_of_range: used a value outside the valid range
上述这些类型,只有exception可以被default initialize,其他的都必须用string或c-style string来初始化,而exception也能初始化。
每个类都只有一个成员函数,就是what(),what()不接受任何参数,返回一个char* 用来表示错误的内容。
C++还有一些其他的错误类型,如bad_alloc,bad_cast,在之后会介绍到。