web-dev-qa-db-ja.com

python sys.exitがtryで機能しない

Python 2.7.5 (default, Feb 26 2014, 13:43:17)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> try:
...  sys.exit()
... except:
...  print "in except"
...
in except
>>> try:
...  sys.exit(0)
... except:
...  print "in except"
...
in except
>>> try:
...  sys.exit(1)
... except:
...  print "in except"
...
in except

試してsys.exit()をトリガーできないのはなぜですか?

ここに投稿されたコードには、すべてのバージョンの詳細が含まれています。

私はそれをトリガーするために知っているすべての可能な方法を試しましたが、失敗しました。 'except'ブロックに到達します。

前もって感謝します..

19
onlyvinish

sys.exit()は例外、つまりSystemExitを発生させます。そのため、exceptブロックに移動します。

この例を見てください:

import sys

try:
    sys.exit()
except:
    print(sys.exc_info()[0])

これはあなたに与えます:

<type 'exceptions.SystemExit'>

実用的な理由があるとは思えませんが、次の構文を使用できます。

import sys

try:
    sys.exit() # this always raises SystemExit
except SystemExit:
    print("sys.exit() worked as expected")
except:
    print("Something went horribly wrong") # some other exception got raised
18
tamasgal

python wikiに基づく:

exit() は最終的に「のみ」例外を発生させるため、メインスレッドから呼び出されたときにのみプロセスを終了し、例外はインターセプトされません。

そして:

exit関数は、プログラムがシグナルによって強制終了されたとき、Python致命的な内部エラーが検出されたとき、またはos._exit()が呼び出されたときに呼び出されません。

したがって、tryブロック内でsys.exit()を使用する場合python SystemExit例外を発生させた後python = exitsの機能の完了を拒否し、exceptionブロックを実行します。

これで、プログラミングの観点からは、tryブロックで例外を発生させることが確実にわかっているものを配置する必要は基本的にありません。代わりに、手動で SystemExit 例外を発生させるか、オプションの引数を渡すようにsys.exit()のそれぞれの機能を失いたくない場合は、よりPython的なアプローチとして発生させることができます。そのコンストラクタに対して、finallyelse、またはexceptブロックでsys.exit()を呼び出すことができます。

方法1(非推奨)

try:
    # do stuff
except some_particular_exception:
    # handle this exception and then if you want 
    # do raise SystemExit
else:
    # do stuff and/or do raise SystemExit
finally:
    # do stuff and/or do raise SystemExit

方法2(推奨):

try:
    # do stuff
except some_particular_exception:
    # handle this exception and then if you want 
    # do sys.exit(stat_code)
else:
    # do stuff and/or do sys.exit(stat_code)
finally:
    # do stuff and/or do sys.exit(stat_code)
8
Kasramvd