我在Python 3.2.3中有以下脚本:
try:
file = open('file.txt', 'r')
except IOError:
print('There was an error opening the file!')
sys.exit()
#more code that is relevant only if the file exists
如果文件不存在(或打开它只是一个错误),如何正常退出?
我可以使用exit()
,但会打开一个对话框,询问我是否要杀死该应用程序。
我可以使用sys.exit()
,但这会引发一个SystemExit异常,它在输出中看起来不太好。我得到了
Traceback (most recent call last):
File "file", line 19, in <module>
sys.exit() SystemExit
我可以使用os.exit()
,但这会在C级别上杀死Python,而不会进行任何清理工作。
我可以使用布尔变量并将所有后续代码包装在if ...但这很难看,这不是我正在执行的唯一检查。所以我想要六个嵌套的ifs ......
我只想打印'有错误...'然后退出。我在IDLE工作。
答案 0 :(得分:17)
这是一种非常优雅的方式。 SystemExit回溯不会在IDLE之外打印。 (可选)您可以使用sys.exit(1)
向shell指示脚本以错误终止。
或者你可以在“main”函数中执行此操作,并使用return
终止应用程序:
def main():
try:
file = open('file.txt', 'r')
except IOError:
print('There was an error opening the file!')
return
# More code...
if __name__ == '__main__':
main()
这里应用程序的主要执行代码封装在一个名为“main”的函数中,然后只有当脚本由Python解释器直接执行时执行,或者换句话说,如果脚本不由另一个脚本导入。 (如果直接从命令行执行脚本,则__name__
变量设置为“__main__”。否则将设置为模块的名称。)
这样做的好处是可以将所有脚本执行逻辑收集到一个函数中,使脚本更清晰,并使您能够使用return
语句干净地退出脚本,就像在大多数编译语言中一样。
答案 1 :(得分:3)
使用sys.exit()很好。如果您关心输出,可以在错误处理部分中添加额外的try / except块来捕获SystemExit并阻止它被定向到控制台输出。
try:
file = open('file.txt', 'r')
except IOError:
try:
print('There was an error opening the file!')
sys.exit()
except SystemExit:
#some code here that won't impact on anything