try块和异常处理

来源:互联网 发布:手机猪八戒考试软件 编辑:程序博客网 时间:2024/06/05 05:26
1、C++的异常处理包括:
throw 表达式,错误检测部分使用这种表达式来说明遇到了不可处理的错误。
try 块,错误处理部分使用它来处理异常。
由标准库定义的一组异常类,用来在throw和相应的catch之间传递有关的错误信息。

2、try块
try{
    program-statements
}catch(exception-specifier){
    handler-statements
}catch(exception-specifier){
    handler-statements
}
一旦catch子句执行结束,程序流程立即继续执行紧随着最后一个catch子句的语句。

3、使用预处理器进行调试
1)可使用NDEBUG预处理变量实现有条件的调试代码:
#ifndef NDEBUG
cerr<<"starting main"<<endl;
#endif
开发完成后,可通过定义NDEBUG预处理变量,删除这些调试语句,大多数编译器都提供定义NDEBUG的命令行选项:
$ CC -DNDEBUG main.C
2)另一种常见的调试技术是使用NDEBUG预处理变量以及assert(断言)预处理宏,assert宏需要一个表达式作为它的条件:
assert(expr)
只要NDEBUG未定义,assert宏就求解条件表达式expr,如果结果为false,assert输出信息并且终止程序的执行。

4、带有因继承而相关的类型的多个catch子句,必须从最低派生类到最高派生类排序。

5、重新抛出:在进行了一些校正行动之后,catch可能确定该异常必须由函数调用链中更上层的函数来处理,catch可以通过重新抛出将异常传递给函数调用链中更上层的函数。重新抛出是后面不跟类型或表达式的一个throw:
throw;
空throw语句将重新抛出异常对象,它只能出现在catch或者从catch调用的函数中。

6、捕获所有异常的处理代码:catch(...),catch(...)与其他catch子句结合使用,它必须是最后一个。

7、函数测试块与构造函数:
template<class T> Handle<T>::Handle(T *p)
try:ptr(p),use(new size_t(1))
}catch(const std::bad_alloc &e)
{   handle_out_of_memory(e);}
catch子句既可以处理从成员初始化列表中抛出的异常,也可以处理从构造函数函数体中抛出的异常。

8、auto_ptr类:auto_ptr类是接受一个类型形参的模板,它为动态分配的对象提供异常安全。

9、定义异常说明:异常说明跟在函数形参表之后,一个异常说明在关键字throw之后跟着一个(可能为空的)由圆括号括住的异常类型列表。
void recoup(int) throw(runtime_error);
空说明列表指出函数不抛出任何异常,函数定义以及该函数的任何声明必须具有相同的异常说明。

10、派生类虚函数的异常说明必须与对应基类虚函数的异常说明同样严格,或者比后者更受限。

11、函数指针的异常说明:如果函数指针不提供异常说明,该指针就可以指向能够抛出任何类型异常的具有匹配类型的函数。
0 0
原创粉丝点击