c++ - 在 C++ 中调度异常

标签 c++ oop exception

应该如何分派(dispatch)异常,以便以集中的、用户友好的方式处理错误处理和诊断?

例如:

  • DataHW 类处理与一些数据采集硬件的通信。
  • DataHW 类可能会根据许多可能的错误抛出异常:间歇性信号、无信号、CRC 失败、驱动程序错误。每种类型的错误都有自己的异常类。
  • DataHW 类由许多执行不同类型的采集和分析的不同代码片段调用。

正确的错误处理策略取决于异常的类型和正在尝试的操作。 (在间歇性信号上,重试 X 次然后告诉用户;在驱动程序错误上,记录错误并重新启动驱动程序;等等)应该如何调用此错误处理策略?

  • 将错误恢复编码到每个异常类中:这会导致异常类相当大并且包含高级 UI 和系统管理代码。这看起来很糟糕。
  • 为每种类型的异常提供单独的 catch block :由于从许多不同的地方调用 DataHW 类,因此每个 catch block 都必须在每次调用时复制地点。这看起来很糟糕。
  • 使用单个 catch block 调用一些 ExceptionDispatch 函数和一个巨大的基于 RTTI 的 switch 语句:RTTI 和 switch 通常表示应用 OO 设计失败,但这似乎是最不坏的选择。

最佳答案

通过捕获 (...) 并调用重新抛出和分派(dispatch)的共享处理函数,避免在每个调用点重复捕获 block :

f()
{
    try
    {
        // something
    }
    catch (...)
    {
        handle();
    }
}

void handle()
{
    try
    {
        throw;
    }
    catch (const Foo& e)
    {
        // handle Foo
    }
    catch (const Bar& e)
    {
        // handle Bar
    }
    // etc
}

关于c++ - 在 C++ 中调度异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/387633/

相关文章:

c# - C# 中的内联 'try' 语句可能吗?

c++ - opencv中的偏斜检测和减少

c++ - 如何在具有抽象类多重继承的 C++ 中使用 clone()?

java - 当我们将 int 参数传递给具有 float 作为一个方法的参数而另一个具有双参数的重载方法时会发生什么

python - 在 Python 中全局处理对象的属性?

c# - 源阵列不够长。检查 srcIndex 和长度,以及数组的下限

c++ - C++中同时使用RAII代码和非RAII代码的问题如何解决?

c++ - 为什么编译器推迟 std::list 释放?

Swift 2 - 核心数据 - 面向对象编程

c++ - 异常是如何转移到寻找处理程序的?