1) C异常处理及其优缺点
l 返回值
每次调用都需要检查,导致代码膨胀,难以阅读主要逻辑。
l 全局错误状态 – _set_errno() & _get_errno()
1) 当无法用返回值传输错误状态时,则用全局变量errno。在errno.h可查询所有已定义的错误码。
这是线程安全的。
2) 在多线程下,每个线程有自己的errno(线程局部存储TLS)。
3) 什么情况无法用返回值返回错误码
比如[]重载:
A& operator [] const (int i)
{
}
不能返回NULL,因为是引用,也不能返回别的值代表错误。
l 信号处理 – signal & raise
1) 信号处理相对较为复杂,信号只有7个,不能重定义,传异常信息也是问题。
2) 使用信号,需包含<signal.h>
3) 在windows中只有这几个信号
#define SIGINT 2 /* interrupt */
#define SIGILL 4 /* illegal instruction - invalid function image */
#define SIGFPE 8 /* floating point exception */
#define SIGSEGV 11 /* segment violation */
#define SIGTERM 15 /* Software termination signal from kill */
#define SIGBREAK 21 /* Ctrl-Break sequence */
#define SIGABRT 22 /* abnormal termination triggered by abort call */
4) 用法如下:
void Func(int signal)
{
//处理
}
int main()
{
signal(SIGINT, Func);
//逻辑处理
raise(SIGINT);//这时候Func运行了,然而,如果还有raise,必须重新设置signal
}
l 非局部跳转 – setjmp & longjmp
1) 其不会调用析构函数。
详细情况请参考
http://blog.csdn.net/yeming81/archive/2010/05/31/5637734.aspx
2) C++异常处理及其优缺点
l