c语言
ErrorNo ErrorCode
enum {写各种错误};
do while
goto
Setjmp longjmp
现在 用的不多 但是看Linux内核代码的时候还是会很多这种
#include <setjmp.h>
jmp_buf env;
double Div(double d1, double d2)
{
if (d2 == 0.0)
{
longjmp(env, 1);//不是一个返回 他是一个 goto
//跳到那里去 作为返回值
}
return d1 / d2;
}
int _tmain(int argc, _TCHAR* argv[])
{
// Setjmp longjmp 现在 用的不多 但是看Linux内核代码的时候还是会很多这种
int ret = setjmp(env);
if (ret == 0)
{
Div(5.0, 1.0);
}
else if (ret == 1)
{
printf("Error");
}
}
c++语言
异常体系
std::exception;//所有的异常体系的基类
std::runtime_error;//他也是一个接口
std::overflow_error;
std::range_error;//计算值错误
std::underflow_error;
std::logic_error;//
std::invalid_argument;//不存在参数
std::length_error;//超出异常
std::out_of_range;
std::domain_error;
//上面的异常 一般用...捕获 ...等同 std::exception
std::bad_alloc;//指针分配错误
std::bad_cast;//转换错误
使用方法
try
{
}
catch (MyExpict& str)
{
str.What();
}
catch (...)//所有的
{
//他是一个线程安全的
//栈里面的数据 都会 正常的销毁
//如何是堆上的 不能。 new
}
注意事项
1 异常继承时需要派生类在基类之前
2 不要抛出指针 如果在栈当中 会被回收 如果在堆当中 会内存泄露
3 永远不在 ~析构函数抛出异常 他会终止程序