我正在编写一个 C++ 应用程序,它需要处理来自 C API 的错误代码,特别是 WinSock2 API。我不确定处理 fatal error 和非 fatal error 的最佳方法。
例如,如果我对 send()
的调用失败,错误代码为 WSAECONNABORTED
,我想将错误返回给调用者,但继续执行程序。在这种情况下,调用者会将连接标记为已终止并继续。但如果失败并出现我认为是致命的错误,例如 WSAENETDOWN
,我希望应用程序终止。
我知道异常用于“异常”情况,因此使用异常来处理 fatal error 情况是有意义的。我想问的是如何处理非 fatal error 情况。
我应该在非致命情况下返回错误代码吗?如果我还需要返回一个值,我将需要返回一个代码(可能成功)和一个值。或者我应该做两个异常分类,比如 FatalError
和 NonFatalError
类,并且只在处理 NonFatalError
异常时尝试恢复?还是有其他/更好的方法来做到这一点?
[更新]澄清
关于我对原始问题的看法似乎有些困惑。我了解如何处理异常、未处理异常时会发生什么、重新抛出异常及其性能特征。
我正在寻求技术/最佳实践来处理并非真正“异常”的情况。在这种情况下,可能发生的错误会导致连接变得不可用,但不会影响服务器的其余部分。
我最好避免为每个错误代码创建一个异常类,因为那样会创建很多几乎无用的异常类。
最佳答案
如果您想将错误向上传播到调用堆栈,您可以使用异常。创建您的自定义类,它继承自 std::exception,如果您想应用特定处理,则捕获它们。
try {
my_function_which_throws();
} catch (const FatalError& e) {
// do something, or rethrow
} catch (const NonFatalError& e) {
// log or do nothing
}
异常只有在抛出时才需要时间来处理。如果您的函数不抛出任何东西,则不会影响性能。
关于c++ - 异常处理和从非 fatal error 中恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26384953/