27

我在 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... 中,但这很难看,而且这不是我正在执行的唯一检查。所以我想要六个嵌套的 if ......

我只想打印 'There was an error...' 并退出。我在 IDLE 工作。

4

2 回答 2

20

这是一种非常优雅的方式。SystemExit 回溯不会在 IDLE 之外打印。或者,您可以使用sys.exit(1)来向 shell 指示脚本因错误而终止。

或者,您可以在“主”函数中执行此操作并用于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语句干净地退出脚本,就像在大多数编译语言中一样。

于 2012-11-16T22:20:35.947 回答
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
于 2013-04-11T08:55:51.857 回答