web-dev-qa-db-ja.com

ファイルが存在しない場合は正常に終了します

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 ...で後続のすべてのコードをラップできますが、それは醜いです、そしてこれは私が実行している唯一のチェックではありません。だから私は6つのネストされたifを持っているでしょう...

「エラーが発生しました...」と表示して終了します。私はIDLEで働いています。

21
Jakub Zaverka

これは非常に優雅な方法です。 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」と呼ばれる単一の関数にカプセル化され、次に実行されますif ifスクリプトがPythonインタープリターによって直接実行される、またはつまり、スクリプトがnotの場合、別のスクリプトによってインポートされます(__name__変数は、スクリプトがコマンドラインから直接実行されている場合、「__ main__」に設定されます。それ以外の場合は、モジュールの名前に設定されます。)

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

16
Hubro

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
2
Lorcan O'Neill