gpt4 book ai didi

c++ - 在 C++ 中处理来自基类的重写方法的异常

转载 作者:行者123 更新时间:2023-11-28 07:02:36 25 4
gpt4 key购买 nike

我正在编写一个程序(实际上是一个库),它应该对给定的数据集进行某种处理。该程序具有插件机制。每个插件都遵循不同的数据处理策略。这个想法是用户可以在插件中创建自己的处理策略,而不必接触程序代码。该软件是一个基于服务器的应用程序,它永远不会终止。问题如下:如果用户提供了自己的插件但他的代码抛出了未处理的异常怎么办?这将使应用程序崩溃并且服务器将脱机。鉴于插件总是创建一个对象,该对象派生自对库和插件都可见的类,显而易见的解决方案是:

class AbstractSolver
{
public:
void solve(void)
{
try {
this->solve_impl();
} catch (...) {
std::cout << "got exception" << std::endl;
}
}
private:
virtual void solve_impl(void) = 0;
};

// This is the class of the plugin
class MySolver : public AbstractSolver
{
private:
void solve_impl(void)
{
throw std::exception();
}
}

虽然这会起作用,但我不想为 AbstractSolver 类的每个公共(public)方法编写 try 和 catch 语句。另外,我想避免宏,我更喜欢 c++ 11 解决方案。我正在考虑引入一个 ExceptionGuard 类,它将 solve_impl 方法作为其构造函数的参数,并将在其中执行 try/catch。我尝试使用 std::function 来传递该方法,但我有点失败了。你必须提出一个更优雅的解决方案吗?谢谢。

最佳答案

What if the user provides his own plugin but his code throws an unhanded exception? This will make the application to crash and the server will go offline.

如果用户提供的插件抛出插件规范不允许的异常,那么这是用户提供的插件中的逻辑错误。当检测到逻辑错误时,正确的做法是立即停止执行并终止进程(可能在最终尝试记录故障或通知系统中的其他组件即将终止之后)。

你不妨问“如果用户提供了自己的插件,但他的代码通过空指针执行间接寻址怎么办?”或者“如果用户提供了他自己的插件,但他的代码进入无限循环或导致死锁并且永远不会返回怎么办?”逻辑错误就是逻辑错误:当你检测到它时,你无法知道进程的状态是什么以及继续执行是否安全。

如果插件不能抛出异常,在基类中将虚函数声明为noexcept。这将要求派生类中的所有重写也为 noexcept。如果覆盖无法处理异常并且该异常泄漏到 noexcept 边界,将调用 std::terminate(),终止执行。如果您需要能够在终止时重新启动服务,请考虑使用监视服务的看门狗进程。

对于在异常边界处处理异常的更普遍的问题,请考虑使用异常翻译器并将可能抛出的代码包装到 lambda 表达式中。我写了一篇关于这个的详细文章:"Exception Boundaries."

关于c++ - 在 C++ 中处理来自基类的重写方法的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22216354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com