c++ - C++ 的异常处理准则

标签 c++ exception-handling c++11

我了解在 C++ 中使用异常处理的好处,并且我知道这可能很棘手。规则之一说,每个函数都可能抛出。好的,但是在某些情况下,我们要确保该函数不会抛出异常。我正在寻找处理此类情况的任何众所周知的做法或指南。示例:

try
{
    // do something
}
catch (std::runtime_error& error)
{
    save_log (error);
    emit_dbus_signal (error);
}

我不关心 save_log()emit_dbus_signal() 是否会失败,我只想确定,我尝试调用它们。

ThreadPool thread_pool;
SocketsPool socket_pool;
MainLoop main_loop;

try
{
    thread_pool.init ();
    socket_pool.init ();

    main_loop.run ();
}
catch (std::runtime_error& error)
{
    save_log (error);
    emit_dbus_signal (error);
}

thread_pool.finalize ();
socket_pool.finalize ();

我只想确定,我尝试完成 thread_poolsocket_pool。终结过程中的任何错误都应在 finalize() 方法中处理。

我记得,哪个函数不会抛出,但它只对小程序起作用。我应该在这种“非抛出”函数的名称中添加像 _nothrow 这样的后缀并在编写代码时处理它吗?自 C++11 以来,异常规范已被弃用,所以我想避免它。 noexcept 怎么样?我仍然不确定我是否理解这个新功能。是我要找的吗?

在 C++11 中没有编译时的异常检查,对吧?

或者也许我完全绞尽脑汁? :)

最佳答案

我认为你需要了解RAII作为起点。

一旦正确使用 RAII,您会发现大多数您认为需要手动完成对象的情况都神奇地消失了:而且,在很多情况下,这意味着您可以省去 try/catch/finalize 方法完全。

正如其他人所说,您仍然希望在某处的 catch 语句中调用 save_log/emit_dbus_signal...

在上述情况下,ThreadPool 的构造函数将调用 init(),而析构函数将调用 finalize()。

关于c++ - C++ 的异常处理准则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7595869/

相关文章:

c++ - 如何在 C++ 类中存储智能指针列表?

c++ - 在 C++ 中格式化字符串是否与 Java 5/6 中的 String.format() 一样方便?

java - 捕获错误的异常

.net - 为什么.net 异常没有被捕获?

c++ - 是否有使用 c++11 的并发原语的合适的 wait_any 实现?

c++ - 将双 vector 拆分为相等的部分

C++ 比较命令行参数与 strcmp

c++ - 基类的 "default"访问说明符差异的基本原理

c++ - C++ 中的右值引用

Java 8 : Lambda-Streams, 按带有异常的方法过滤