22

我编写了一个简单的应用程序,它读取数据文件,解析文本,然后对该数据进行一些处理。数据文件在我的 main() 函数中打开。如果确定文件未正确打开,使用 exit() 函数是一种好的编程习惯吗?例如:

if (!file.is_open() ){
     exit(1);
}

此外,我的程序有一个单独的函数来解析文件中的数据。此函数由 main() 调用。如果函数在数据中发现错误,我希望程序在打印错误消息后停止。在这种情况下,可以在我的解析函数中使用 exit() 函数吗?我问这个问题是因为,对我来说,允许函数自行退出程序而不将控制权返回给 main() 函数似乎不是很整洁。(如果这个问题看起来很明显,我深表歉意。我是 C++ 和一般编程的新手)。

4

6 回答 6

20

从函数调用exit并不是“坏的”,因为它具有明确定义的行为——这样做从根本上没有错。

但是,例如,如果您正在编写一个可能最终出现在库中的函数,那么exit从那里调用通常是不好的做法:向调用代码发出错误信号要好得多(例如通过特定的返回值或异常) ) 并让调用代码决定要做什么。(虽然在某些情况下它是完全有效的。例如,如果您正在编写一个名为 的函数quit_if_file_not_found,那么您的用户期望终止。)

在您的情况下,您的解析函数可能不应该调用exit:例如,您可能希望在将来的某个时候,如果解析第一个文件失败,您的主代码会要求用户提供不同的文件名。如果您的解析例程终止程序,您必须同时修改主代码和该函数。如果它已发出错误信号,您只需修改main.

(并且不要exit像上面那样打印错误消息或记录一些事情,这会让那些不知道如何解决代码遇到的任何问题的用户感到沮丧。)

于 2013-01-01T09:48:16.230 回答
7

有两个方面。一是利益决定程序停在你要使用的地方exit,二是使用exit。马特的回答涵盖了第一个。

第二,exit在 C++ 中通常是一个糟糕的选择。原因是它做了一些清理(注册的函数atexit,有时包括一些静态存储持续时间对象的析构函数),但不是全部(堆栈上对象的析构函数),根据我的经验,你要么想要全部,要么没有任何。

于 2013-01-01T10:01:14.000 回答
3

exit(0)表示程序成功终止并且它是完全可移植的,而

exit(1)(通常)表示终止不成功。但是,它的用法是不可移植的。

于 2013-01-01T09:42:33.030 回答
3

从ormain没有区别。您使用返回/退出值表示成功,使用表示失败。exit(1)return 10 0

如果您的子例程是在其他地方使用的库例程,它应该将控制权返回给 main,并带有一些返回代码或异常。否则,这是你的选择,如果你exit或返回。

在任何一种情况下,记录函数的作用是一种很好的做法,无论是它exitreturn代码还是exception.

于 2013-01-01T09:46:19.027 回答
2

这取决于它exit(1)来自哪里。您不应该exit(1)从库中调用它,而只能从您自己的应用程序中调用它。

如果您需要设置错误代码,您可以设置一个errno(STD C 变量,是的)。

如果你想尝试更多的 C++ 方式,你可以抛出异常,并附上详细的错误代码。

于 2013-01-01T09:48:09.227 回答
1

退出是可以接受的,尽管我认为重要的是要注意使用 exit 与 return 语句在该退出中的内存差异不会破坏内存中的变量。如果有一些错误,那么退出是合理的。否则,我会坚持返回声明。

于 2013-03-22T00:55:56.827 回答