【问题标题】:Should I use std::cerr and exit() instead of throwing an exception?我应该使用 std::cerr 和 exit() 而不是抛出异常吗?
【发布时间】:2019-10-17 18:16:11
【问题描述】:

我对 C++ 比较陌生,我只是想知道,仅抛出异常或编写 std::cerr 和 exit() 之间的主要区别是什么?我知道如果没有捕获到异常,程序将退出。 std::cerr 是否有任何用例,还是我应该总是抛出异常?或者我一般不应该使用 std::cerr 吗?对此有一些最佳做法吗?

throw std::runtime_error("runtime error msg");

std::cerr << "cerr error msg";
exit(1);                      

两个版本都可以吗?

【问题讨论】:

  • 不同的是可以捕获异常。它不一定会结束你的程序,只有在没有人捕捉到它的情况下。
  • 视情况而定。如果您有任何机会调用者可以纠正导致错误发生的任何原因,那么使用异常可能会更好(如果调用者没有捕获并处理异常,这将导致终止)。如果调用者纠正错误原因的可能性为零,那么退出比抛出异常要好。 [注意:在多线程程序中,不应调用exit()]。
  • 您有多个问题。请为此问题选择“例外与退出”或“如何/何时使用std::cerr”,并将另一个移至新问题。 (既然已经有了答案,你应该保留与之匹配的问题。)如果你不明白为什么这些问题是独立的,请考虑代码std::cerr &lt;&lt; "cerr error msg"; throw std::runtime_error("runtime error msg");

标签: c++ exception


【解决方案1】:

两者的主要区别在于您可以捕获和处理异常(使用throw 引发)。此操作有两个优点:

A.您可以抛出异常并处理它而不会导致程序崩溃。

B.处理异常时,它们会自动调用对象的析构函数。例如:

try {
    A a;
    throw runtime_error("A"); // Throw exception A
} catch (...) { // Catch exception A & Call a's object destructor.
    throw runtime_error("B"); // Throw exception B and crush (if no one else catch it).
}

如果您考虑将来处理此代码(或者如果其他人需要继续处理此代码),您想使用throw 而不是exit(1) 选项。

更多详情请见:Are destructors run when calling exit()? & Are destructors called after a throw in C++?

【讨论】:

  • 未捕获的异常可能会也可能不会调用析构函数——它是实现定义的。
猜你喜欢
  • 2013-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-27
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多