C++ 异常处理(二)

时间:2022-12-31 20:41:54

异常处理的一个特性为:

引发异常时编译器总是创建一个临时拷贝,即使异常规范与catch块中指定的是引用。

伪代码:

class problem { ... };
...
void super() throw (problem)
{
...
if (oh_no)
{
problem oops; //construct object
throw oops; // throw it
...
}
...
}
...
try{
super();
}
catch (problem& p) //引用
{
...
}

这里p指向的是oops的副本,而不是oops本身,

原因:函数super()执行完,oops不复存在。

但既然throw生成了副本,何必还用引用呢?

原因:引用还有一个重要特性,基类引用可以执行派生类对象。

假设有一组通过继承关联的异常类型,则在异常规范中只需列出一个基类引用,它将与任何派生类对象匹配。


关于异常类层次结构:

伪代码:

class bad_1 { ... };
class bad_2 : public bad_1 { ... };
class bad_3 : public bad_2 { ... };
...
void test_ex()
{
...
if (a)
throw bad_1();
if (b)
throw bad_2();
if (c)
throw bad_3();
...
}
...
try{
test_ex();
}
catch(bad_3& be)
{
...
}
catch(bad_2& be)
{
...
}
catch(bad_1& be)
{
...
}
如果将bad_1&处理程序放在最前面,它将捕获异常bad_1,bad_2,bad_3;

通过按相反的顺序排列,bad_3异常将被bad_3&处理程序捕获。


假如有一个调用了另一个函数的函数,不知道被调用的函数可能引发哪些异常,

在这种不知道异常类型的情况下,也能捕获异常,方法是用省略号来表示异常类型。

catch( ... )
{
// ...
}

try{
test_ex();
}
catch(bad_3& be)
{
...
}
catch(bad_2& be)
{
...
}
catch( ... ) // catch whatever is left
{
// ...
}