我有很多看起来像这样的方法
try {
.....
} catch (const MyException & e) {
return HandleError(e);
} catch (const std::exception & e) {
return HandleError(e);
}
及处理功能
HRESULT HandleError(const std::exception & ex, HRESULT code) {
SetErrorInfo(ex.what());
return code;
}
HRESULT HandleError(const std::exception & ex) {
return HandleError(ex, E_UNEXPECTED);
}
HRESULT HandleError(const MyException & ex) {
return HandleError(ex, ex.code);
}
问题:是否可以将catch块减少到这种形式
try {
.....
} catch (const std::exception & e) {
return HandleError(e);
}
并且在函数本身中,已经决定了它是什么类型的异常以及如何处理它
HRESULT HandleError(const std::exception & ex) {
if (ex is MyException) // нужен оператор проверки класса-наследника
return HandleError(ex, dynamic_cast<MyException)(ex).code);
else
return HandleError(ex, E_UNEXPECTED);
}
因为您需要检查来自不同库的几个不同异常,并且每个异常都有自己的错误代码。我不想插入相同捕获的梯子。我还没有看到宏。
这是通过在不同的上下文中抛出并重新捕获当前异常来完成的:
当然,
dynamic_cast
帮忙。有const std::exception &e
,这样做:你也可以
HandleError
什么都不转移进去,然后在里面做一个try {throw;}
梯子catch
。然后在调用代码中,你可以简单地写catch (...) {return HandleError();}
.如果你担心如果你在 catch 之外调用这样的函数可能会导致崩溃,那么就别看
std::current_exception
- 这是一个替代品throw;
,但允许你现在检查是否有异常。