【问题标题】:Exception handling and recovering from non-fatal errors异常处理和从非致命错误中恢复
【发布时间】:2014-10-15 14:21:41
【问题描述】:

我正在编写一个 C++ 应用程序,它需要处理来自 C API,特别是 WinSock2 API 的错误代码。我不确定处理致命错误与非致命错误的最佳方法。

例如,如果我对send() 的调用失败并出现错误代码WSAECONNABORTED,我想将错误返回给调用者,但继续执行程序。在这种情况下,调用者会将连接标记为已终止并继续。但如果它失败并出现我认为是致命的错误,例如WSAENETDOWN,我希望应用程序终止。

我知道异常用于“异常”情况,因此使用异常来处理致命错误情况是有意义的。我要问的是如何处理非致命错误情况。

在非致命情况下我应该返回错误代码吗?如果我还需要返回一个值,我将需要返回一个代码(可能成功)和一个值。或者我应该进行两个异常分类,比如FatalErrorNonFatalError 类,并且只在处理NonFatalError 异常时尝试恢复?还是有其他/更好的方法来做到这一点?

[更新]说明
我对原始问题的理解似乎有些混乱。我了解如何处理异常、不处理异常时会发生什么、重新抛出异常以及它们的性能特征。

我正在寻求技术/最佳实践来处理并非真正“异常”的情况。在这种情况下,可能发生的错误会导致连接变得不可用,但不会影响服务器的其余部分。

我最好避免每个错误代码都有一个异常类,因为这会产生很多几乎无用的异常类。

【问题讨论】:

  • 如果您不想处理它,请在您的 catch 子句中使用 throw;。没有任何支持,通过 terminate() 结束程序。 Bam,死了,对用户没有任何提示。
  • “异常与返回码”与“是否致命”完全正交。

标签: c++ exception-handling


【解决方案1】:

如果您想将错误传播到调用堆栈,您可以使用异常。创建您的自定义类,这些类继承自 std::exception,如果您想应用特定处理,则捕获它们。

try {
  my_function_which_throws();
} catch (const FatalError& e) {
  // do something, or rethrow
} catch (const NonFatalError& e) {
  // log or do nothing
}

只有在抛出异常时才需要时间来处理。如果你的函数不抛出任何东西,它不会影响性能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2021-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多