异常处理和从非致命错误中恢复

时间:2014-10-15 14:21:41

标签: c++ exception-handling

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

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

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

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

[更新]澄清
关于我对原始问题的看法似乎有些混乱。我理解如何处理异常,当它们不处理时会发生什么,重新抛出异常以及它们的性能特征。

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

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

1 个答案:

答案 0 :(得分:0)

如果要在callstack中传播错误,可以使用异常。创建继承自std :: exception的自定义类,如果要应用特定处理,请捕获它们。

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

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