2016-08-05 2 views
2

次の例を考えてみます。この簡単な例を実行するとTRYループでexit(0)を実行すると、例外がスローされるのはなぜですか?

try: 
    print "Try this." 
    exit(0) 
except: 
    print "Failed." 
    exit(1) 

、次はstdoutに出力されます。

Try this. 
Failed. 

が明白な答えがあるか、これはすでに求められている場合なら、私を許して、なぜexit(0)(私はきれいな出口を与えるべきですか?)は例外をスローしますか?

私は私はexit(0)は(N隠さを投げている推測(1)try条件はexit(0).

に言う場合でも、実際のユース・ケース・スクリプトでtry: except:ループを使用して試みたが、スクリプトが出ることがわかっ?)何らかの並べ替えの例外が、なぜですか?トレースバック(CTRL + Cを使用してKeyboardInterrupt例外を生成する場合など)が表示されず、私のケースでは0のリターンが予想され、1のリターンで終了するなどの予期しない動作が発生します。

例外(例外) pythonスクリプトを終了する方法はありますか?

+0

Googleの 'python exit'だけでこれに関する多くの情報が表示されます。 – user2357112

+0

@ user2357112申し訳ありませんが、私は今日は盲目だと思います。重複としてフラグが立てられています。どうも。 – LegendaryDude

答えて

1

ここで発生する例外はSystemExit例外です。したがって、あなたがしようとした場合:

try: 
    print "Try this." 
    exit(0) 
except SystemExit: 
    pass 
except: 
    print "Failed." 
    exit(1) 

出力は次のとおりです。

import os 
try: 
    print "Try this." 
    os._exit(0) 
except SystemExit: 
    pass 
except: 
    print "Failed." 
    os._exit(1) 

user2357112を引用:

Try this. 

これを防ぐために、あなたは例外をスローせずに、直接終了しos._exit()を呼び出すことができます。

os._exit finallyブロックをスキップする、コンテキストマネージャー__exit__ s、出口ハンドラ、およびその他の重要なクリーンアップが含まれているので、いくつかの非常に特殊なケース(私はそれらのほとんどがフォークを含むと信じています)を使用するのは良い考えではありません。

+0

'SystemExitを除いて'あなたが思うことはしません。 – user2357112

+0

さて、私を助けてください。私はその例外をテストしないことを意味しました... –

+0

"これ以外のすべての例外"を指定する方法はありません。あなたが得ることができる最も近いものは、 'except eException'を使ってすべての例外をキャッチし、' if isinstance(e、SystemExit):raise'( 'raise'に引数なし)で望ましくないものをuncatchingすることです。 – user2357112

関連する問題