27

Python3.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 ...でラップできますが、それは醜いです。これは、実行しているチェックだけではありません。だから私は6つのネストされたifが欲しいです...

「エラーが発生しました...」を出力して終了します。私はIDLEで働いています。

4

2 に答える 2

20

これは非常に優雅な方法です。SystemExitトレースバックはIDLEの外部には出力されません。オプションsys.exit(1)で、スクリプトがエラーで終了したことをシェルに示すために使用できます。

または、「メイン」関数でこれを実行し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インタープリターによって直接実行される場合、つまり、スクリプトが別のスクリプトによってインポートされない場合にのみ実行されます。(スクリプトがコマンドラインから直接実行されている場合、変数は「__main __」に設定されます。それ以外の場合は、モジュールの名前に設定されます。)__name__

returnこれには、すべてのスクリプト実行ロジックを1つの関数にまとめてスクリプトをクリーンにし、ほとんどのコンパイル言語と同様に、ステートメントを使用してスクリプトをクリーンに終了できるという利点があります。

于 2012-11-16T22:20:35.947 に答える
3

sys.exit()の使用は問題ありません。出力に関心がある場合は、エラー処理セクション内にいつでも追加のtry / exceptionブロックを追加して、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 に答える