1

我很确定这里有类似的问题,但我找不到。

假设我有几个函数,它们可能会抛出整个异常层次结构——比如说N种异常类。

现在,有没有一种很好的方法来处理所有这些异常,而不是用N 块编写多次相同的代码catch

我实现这一点的(非常丑陋的)方法是使用宏。其他想法?

所有函数都有不同的输入/输出参数和返回类型


编辑

是的,所有异常都有相同的基类——它是一个层次结构。但是不同的类有不同的附加信息。

例子:

try
{
    object->execute( ... );
}
catch( type1& ex )
{
    // ...
}
//...
catch( typeN& ex )
{
    // ...
}

// some other code
// and again:

try
{
    object->do_something_else( ... );
}
catch( type1& ex )
{
    // ...
}
//...
catch( typeN& ex )
{
    // ...
}

// and so on
4

3 回答 3

3

创建一个调用的函数,该函数handleExceptions(Exception&)引用异常的基类。

在那个函数中,你可以做任何你想做的事情,例如调用一些特定于Exception. 您还可以定义实际存在的异常dynamic_cast等。

于 2012-07-02T10:23:22.770 回答
2

已经提到了通过基类捕获并将异常提供给 handleException 方法,然后该方法会打开实际的底层类型。这是另一种方法,相反:

您可以编写一个函数exception_check,它接受一个仿函数并在适当的内部执行它try..catch

template<typename Func>
Func exception_check(Func fun)
{
    try
    {
        func();
    }
    catch( type1& ex )
    {...}
    //...
    catch( typeN& ex )
    {...}
    return func; //in case the functor stores a result. 
}

当然,要使生成的代码看起来不那么丑陋,您可能需要 C++11 及其 lambda 函数,否则您会将代码分散在许多仿函数上。使用 lambda 函数,它可以简单地称为

exception_check([&](){ object->execute(...); }); 
exception_check([&](){ object->do_something_else(...); }); 

就我个人而言,我发现这更好地阅读然后在每个函数调用周围进行一次尝试/捕捉。

当然,在 c++11 中,对仿函数使用完美转发而不是复制它可能是个好主意。

于 2012-07-02T13:34:50.523 回答
1

traget 函数的每个调用都应该有自己的 try 块,除非您可以将这些调用组合成一个内部带有 switch 的函数。

您可以捕获基类并调用一个通用函数,该函数将使用该typeid操作或任何其他方式来区分内部可能的异常类型。由于异常应该很少发生,因此使用 RTTI 的开销可能是可以接受的。

于 2012-07-02T10:26:43.737 回答