在我经历过的项目中,很少使用异常处理;对于问题的调试与追踪,基本上都是基于错误码和日志信息。
这里的学习总结来自于<<C++编程思想 第2卷>>和网络,有很多问题的理解还需要实践经验。
在C语言中处理异常的3种方式:
1) 在函数中返回错误信息;
2) 使用标准C库中的信号处理系统,由函数signal()和raise()实现;
3) 使用标准C库中的非局部跳转函数:setjmp()和longjmp()。
如果在C++中使用C的错误处理方式将会遇到的问题:
信号处理方法signal()/raise()和函数setjmp()/longjmp()并不调用析构函数,所以对象不会被正确清理。
(顺便说下goto: 使用goto跳入某个作用域,或者使用longjmp()跳出某个作用域,然而这个作用域的栈中有某个对象需要析构时,程序的行为是不确定的)
C++中异常处理流程:
1.设置一个try块;
2.在try块中用关键字throw抛出异常;
3.紧跟try块用异常处理器catch处理异常。
C++异常处理最大的用处:当异常抛出时,程序将做恰当的清理工作。
新名词解释:
栈反解(stack unwinding):异常发生之前创建的局部对象自动被销毁。
RAII(
这里的学习总结来自于<<C++编程思想 第2卷>>和网络,有很多问题的理解还需要实践经验。
在C语言中处理异常的3种方式:
1) 在函数中返回错误信息;
2) 使用标准C库中的信号处理系统,由函数signal()和raise()实现;
3) 使用标准C库中的非局部跳转函数:setjmp()和longjmp()。
如果在C++中使用C的错误处理方式将会遇到的问题:
信号处理方法signal()/raise()和函数setjmp()/longjmp()并不调用析构函数,所以对象不会被正确清理。
(顺便说下goto: 使用goto跳入某个作用域,或者使用longjmp()跳出某个作用域,然而这个作用域的栈中有某个对象需要析构时,程序的行为是不确定的)
C++中异常处理流程:
1.设置一个try块;
2.在try块中用关键字throw抛出异常;
3.紧跟try块用异常处理器catch处理异常。
C++异常处理最大的用处:当异常抛出时,程序将做恰当的清理工作。
新名词解释:
栈反解(stack unwinding):异常发生之前创建的局部对象自动被销毁。
RAII(