何时在C++中使用Ext()和VS异常更好?

何时在C++中使用Ext()和VS异常更好?,c++,exception,error-handling,C++,Exception,Error Handling,我正在编写一个程序,根据输入值,代码将终止。这让我想到了实现这一目标的最佳方法。我可以很容易地举出两个例子: 如果是坏的(u)值,{ 清理;; 出口1; } 诸如此类 尝试 myFunc; 捕获我的异常{ 清理;; 出口1; } int myFunc{ 如果badValue抛出myException; ... } 第一个代码块看起来更干净,所以我想知道为什么要使用异常?我猜这是一个C vs VC++的战斗。如果你写应用程序代码,调用Excel就很好,但是如果你写的是库代码,那就不好,因为退出可能

我正在编写一个程序,根据输入值,代码将终止。这让我想到了实现这一目标的最佳方法。我可以很容易地举出两个例子:

如果是坏的(u)值,{ 清理;; 出口1; } 诸如此类

尝试 myFunc; 捕获我的异常{ 清理;; 出口1; } int myFunc{ 如果badValue抛出myException; ... } 第一个代码块看起来更干净,所以我想知道为什么要使用异常?我猜这是一个C vs VC++的战斗。如果你写应用程序代码,调用Excel就很好,但是如果你写的是库代码,那就不好,因为退出可能会迫使整个应用程序终止,可能是因为库代码失败并不重要,应用程序宁愿继续。
注意:您应该调用exitEXIT_FAILURE来告诉调用进程您的程序失败。如果抛出一个异常而不捕获它,这也就足够了。

你是对的,这是一个C风格与C++风格的问题。

传递通过/失败标志的C习惯用法意味着您必须在可能发生错误的每个地方显式检查错误。如果该标志需要进一步向上传递到调用堆栈,则每个函数都必须允许它。它很快就会变得笨重

调用exit意味着低级代码正在就如何处理错误做出不可撤销的决定。这通常是不合适的。例如,如果无法打开某个文件,您可以向用户发出一条消息,指示该文件,然后在没有该文件的情况下运行。

您不应该使用exit。为了避免调用所有析构函数,应该使用std::quick_exit

所有异常都应该在代码的顶层进行处理,不要忘记日志记录或一些恢复过程。

退出对于小程序来说很好。对于较大的程序,它有几个问题。首先,并非所有的错误都应该终止一个程序——通常它可以恢复

第二个问题:即使您想要终止,也很难编写一个清理函数来处理程序各个部分中分配的所有资源。这就是C++中RAII的意思。exit与RAII不兼容,因为它不调用析构函数,全局或静态对象除外

第三个问题:在错误检测点,您通常无法构造对最终用户有意义的错误消息,但在捕获异常时可以构造这样的错误消息


通常情况下,困境是不同的:异常的替代方法是使用返回码来指示错误。异常和返回代码之间有多种权衡,数百篇文章专门讨论这个主题。它太大了,无法在这个答案中进行分析。

我会冒险说永远不会。在编写操作系统时,曾经有一条规则,即整个操作系统中只能有一条HALT指令。应用程序IMHO也是如此。我曾经维护过一个由数千行代码组成的程序,以前的开发人员认为,如果链接列表被越界访问,则最好退出整个程序。因此,从最终用户的角度来看,应用程序只是随机关闭。我认为@JohnZwinck的部分答案应该放在这里:如果你在编写应用程序代码,调用exit是可以的,但是如果你在编写库代码,那么调用exit是不好的,因为exit迫使整个应用程序终止,而库代码故障可能并不那么重要,应用程序宁愿继续。