c++ - 异常处理和从非 fatal error 中恢复

标签 c++ exception

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

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

我知道异常用于“异常”情况,因此使用异常来处理 fatal error 情况是有意义的。我想问的是如何处理非 fatal error 情况。

我应该在非致命情况下返回错误代码吗?如果我还需要返回一个值,我将需要返回一个代码(可能成功)和一个值。或者我应该做两个异常分类,比如 FatalErrorNonFatalError 类,并且只在处理 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/

相关文章:

c++ - 是否可以使用填充构造函数创建 std::vector<std::unique_ptr<Bar>> ?

c++ - C++ 头文件中的 const 数组声明

c++ - 如何使用数组地址反转数组?

C++11 编译器生成的函数

python - 为什么异常是可迭代的?

Java异常处理用户输入

c++/win32 - LB_GETTEXT 仅返回一个字符

.net - 如何将 PDFSharp 对象保存到多个文件?

exception - 我无法将验证消息设置为约束

C++ ODBC 未处理的异常/访问冲突写入位置