2

特定の条件がトリガーされると、処理を完全に停止する必要があるプログラムがあります。これは、次の質問に似ています: Python スクリプトの実行を中止するにはどうすればよいですか?

ただし、私の場合、sys.exit() が生成するトレースバックをキャプチャし、最も重要なこととして、その時点を超えるコード ブロックの処理を停止したいと考えています。誰でもこれを手伝ってもらえますか?

try:
    a = 'i' / 1
    print 'Does this work yet?'
except TypeError:
    print "I should stop processing now"
    try:
        sys.exit()
    except:
        pass
print 'I did not stop processing '
4

3 に答える 3

3

sys.exit()トレースバックが生成されないことがわかっている限り、あなたが何を求めているのか完全にはわかりません。コードをそのまま実行しようとするとsys.exit()、「sys」モジュールをインポートしていないため、未処理のNameError例外が発生します。sys.exit()の呼び出しをtry / exceptionブロックで囲むと、NameError例外がキャプチャされますが、ドキュメントに従って、sys.exit()によって発生した通常の例外もキャプチャされます。

Pythonを終了します。これは、SystemExit例外を発生させることによって実装されるため、tryステートメントのfinally節で指定されたクリーンアップアクションが尊重され、外部レベルでの終了試行をインターセプトすることができます。

エラーが発生すると処理を停止するバージョンを次に示します。

import sys

try:
    a = 'i' / 1
    print 'Does this work yet?'
except TypeError:
    print "I should stop processing now"
    sys.exit()
print 'I did not stop processing '

このコードがメインモジュールにある場合は、エントリポイントコードを次のようにラップすることをお勧めします。

import sys

def main():
    try:
        a = 'i' / 1
        print 'Does this work yet?'
    except TypeError:
        print "I should stop processing now"
        return 1
    print 'I did not stop processing '
    return 0

if __name__ == "__main__": sys.exit(main())

このようにすると、sys.exit()の呼び出しは1回だけになり、問題があったかどうかを示すエラーコードが返されます。コードが最上位のエントリポイントにない場合は、main()メソッドに到達するまで例外をスローし、エラーコード値を返すことをお勧めします。定義する必要のある新しい「StopMyApplicationException」で実際の例外をラップできます。

ああ、そしてトレースバックを印刷したい場合は、tracebackモジュールを使用できます。のようなものtraceback.print_exc()がその仕事をします。

于 2012-11-08T23:42:24.273 に答える
1

システム終了例外がExceptionから派生しないという事実を利用できます。

try:
    a = 'i' / 1
    print 'Does this work yet?'
except TypeError:
    print "I should stop processing now"
    try:
        raise SystemExit
    except Exception:
        pass
于 2012-11-08T23:25:24.597 に答える
0

生成された例外にアクセスできますがsys.exit、トレースバックはありません。

try:
    sys.exit()
except SystemExit as e:
    # do what you want with e, e.g.
    traceback.print_exc(e)
    raise

raise句内の裸はexcept、キャッチされた例外を再発生させます。

于 2012-11-09T00:02:29.117 に答える