在C++中调度异常

Jos*_*ley 3 c++ oop exception

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

例如:

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

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

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

fiz*_*zer 6

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

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

void handle()
{
    try
    {
        throw;
    }
    catch (const Foo& e)
    {
        // handle Foo
    }
    catch (const Bar& e)
    {
        // handle Bar
    }
    // etc
}
Run Code Online (Sandbox Code Playgroud)