12

sys.exit()Pythonで例外を呼び出すこととスローすることの違いは何ですか?

次のことを行うPythonスクリプトがあるとしましょう。

  1. ファイルを開く
  2. 行を読む
  3. それを閉じる

ファイルが存在しないか、IOException実行時にスローされる場合、以下のオプションのどれがより理にかなっていますか?

  1. 例外の例外/キャッチはありません。例外が発生した場合、失敗します(とにかく予想される動作です)
  2. 例外を除く/キャッチし、エラーメッセージをログに記録し、カスタマイズされた例外を自分でスローし、失敗します。
  3. except IOExceptionブロック内で、エラーメッセージを表示して終了します。sys.exit("something is wrong")

オプション3はプロセスを強制終了しますが、1と2は強制終了しませんか?PythonにJavaのようなチェックされた例外がない場合(私は実際にはJava開発者です^ _ ^)、Python例外を処理するための最良の方法は何ですか?

4

2 に答える 2

19

sys.exitはそれ自体を発生させるSystemExitので、純粋に技術的な観点から、その例外を自分で発生させることと、を使用することの間に違いはありませんsys.exitSystemExitそして、はい、他の例外と同じように例外をキャッチして無視することができます。

したがって、それはあなたの意図をよりよく文書化することの問題です。

PS:これは、sys.exit実際にはかなり悪い誤称であることも意味することに注意してください。スレッドで使用する場合sys.exit、スレッドのみが終了し、他には何も終了しないためです。はい、それはかなり迷惑になる可能性があります。

于 2012-05-29T10:02:10.230 に答える
6

小さな微妙な違いがあります:

import sys

try:
    sys.exit()
except:
    print("Caught")

そのexceptステートメントは例外をキャッチしますが、次のようになります。

import sys

try:
    sys.exit()
except Exception:
    print("Caught")

エラーなしで終了します。SystemExit例外(のようなKeyboardInterrupt)はによってキャッチされませんが、単独でexcept Exceptionキャッチされます。except

したがって、発信者がすべてをキャッチした場合except:(これは悪い習慣です)、あなたsys.exitは終了しませんが、「エラー」と見なされます。そのため、 CTRL + Cとシステム出口(クラスexcept Exception:のもの)を除くすべての例外を確実にキャッチする方がよいのです。BaseException

于 2018-02-01T20:40:59.293 に答える