我了解在 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_pool
和 socket_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/