我编写了一个简单的应用程序,它读取数据文件,解析文本,然后对该数据进行一些处理。数据文件在main()函数中打开。如果确定文件未正确打开,使用exit()函数是否是一种很好的编程习惯?例如:
if (!file.is_open() ){
exit(1);
}
此外,我的程序有一个单独的函数来解析文件中的数据。 main()调用此函数。如果函数在数据中发现错误,我希望程序在打印错误消息后停止。在这种情况下,在我的解析函数中使用exit()函数是否可以接受?我问这个问题是因为,对我来说,允许一个函数自己退出程序而不将控制返回到main()函数似乎并不是很整洁。 (如果这个问题看起来非常明显,我道歉。我是C ++和编程的新手)。
答案 0 :(得分:15)
从函数调用exit
并不是“坏”,因为它具有明确定义的行为 - 这样做没有任何根本错误。
但是,如果您正在编写一个可能最终存在于库中的函数,那么从那里调用exit
通常是不好的做法:向调用代码发出错误信号要好得多(通过例如一个特定的返回值或异常)让调用代码决定做什么。 (有些情况下它完全有效。例如,如果您正在编写一个名为quit_if_file_not_found
的函数,那么,您的用户期望终止。)
在您的情况下,您的解析函数可能不应该调用exit
:您可能希望,例如,在将来的某个时候,您的主代码要求用户在解析时使用不同的文件名第一个失败了。如果解析例程终止程序,则必须修改主代码和该函数。如果它已发出错误信号,则您只需修改main
中的逻辑。
(并且不仅仅exit
没有打印错误消息或记录您上面所做的事情,这将使那些无法知道如何解决问题的沮丧用户遇到的代码。)
答案 1 :(得分:6)
有两个方面。一个是决定在你想要使用的地方停止程序的兴趣exit
,另一个是退出的使用。 Mat's answer涵盖了第一个。
对于第二种,exit
在C ++中通常是一个糟糕的选择。原因是它做了一些清理(用atexit
注册的函数,有时包括静态存储持续时间的某些对象的析构函数),但不是所有这些(堆栈中对象的析构函数),根据我的经验你要么想要所有这一切或没有。
答案 2 :(得分:4)
exit(0)
表示程序终止成功&它是完全便携的,而
exit(1)
(通常)表示不成功终止。但是,它的使用是不可移植的。
答案 3 :(得分:1)
来自main
exit(1)
或return 1
没有区别。您使用0
的返回/退出值表示成功,使用非 0
表示失败。
如果您的子例程是一个在其他地方使用的库例程,它应该使用一些返回码或异常将控制权返回给main。否则,如果您exit
或返回,则可以选择。
在任何一种情况下,记录该功能的作用都是很好的做法,无论是exit
,return
代码还是exception
。
答案 4 :(得分:1)
这取决于exit(1)
的来源。您不应该从库中调用此exit(1)
,只能从您自己的应用程序调用。
如果您需要设置错误代码,可以设置errno
(STD C变量,是)。
如果您想尝试更多C ++方式,可以抛出异常,并提供详细的错误代码。
答案 5 :(得分:1)
退出是可以接受的,虽然我认为重要的是要注意在退出中使用exit与return语句的内存差异不会破坏内存中的变量。如果有错误,则退出是合理的。否则,我会坚持退货声明。