Python
 Computer >> コンピューター >  >> プログラミング >> Python

PythonでSystemExit例外をキャッチする方法

Pythonの公式ドキュメントによると、SystemExitExceptionクラスのサブクラスではありません。SystemExitの基底クラスはBaseExceptionであり、これはExceptionよりもさらに上位に位置するクラスです。そのため、except Exception:と記述してもSystemExitは捕捉されません。これを正しくキャッチするには、ExceptionBaseExceptionに置き換える必要があります。

例1:BaseExceptionでキャッチする

try:
    raise SystemExit
except BaseException:
    print("It works!")

出力

It works!

SystemExitStandardErrorExceptionではなくBaseExceptionを継承しているのは、意図的な設計によるものです。これにより、プログラムの終了処理が、汎用的なExceptionをキャッチする通常のエラーハンドリングコードによって誤って妨げられることを防いでいます。

なお、sys.exit()を呼び出した際に内部で発生するのもこのSystemExit例外であり、インタプリタはこれを受け取ると終了処理を行います。

ただし、実務上はBaseExceptionで広くキャッチするのは推奨されません。BaseExceptionKeyboardInterruptなども含むため、意図しない割り込みまで握りつぶしてしまう恐れがあるからです。より良い書き方は、キャッチしたい例外を明示的に指定することです。

例2:SystemExitを直接キャッチする(推奨)

try:
    raise SystemExit
except SystemExit:
    print("It works!")

出力

It works!

このようにexcept SystemExit:と具体的に指定すれば、他の例外に影響を与えることなく、プログラムの終了だけを確実にハンドリングできます。特別な理由がない限り、こちらの書き方を採用しましょう。

  1. PythonでKeyError例外をキャッチする方法をわかりやすく解説

    Pythonでは、辞書(dict)に存在しないキーを使って値へアクセスしようとすると、KeyError例外が発生します。この記事では、try-except文を使ってKeyErrorをキャッチし、例外の種類や詳細情報を確認する方法を解説します。 KeyErrorが発生する仕組み 次のコードは、辞書に存在しないキー c で値を取得しようとしているため、KeyErrorが発生します。sys.exc_info() を使うと、発生した例外の型などの情報を取得できます。 import sys try: s = {a: 5, b: 7}[c] except: print(sys.exc_i

  2. Pythonのリスト内包表記で例外をキャッチするには?原因と対処法を解説

    Pythonには、例外を処理したり無視したりするための組み込み関数は存在しません。そのため、リスト内包表記の中ですべての例外を処理することは不可能です。 その理由は、リスト内包表記が「式(expression)」で構成されている点にあります。例外のキャッチや無視、ハンドリングを行えるのは「文(statement)」である try〜except ブロックだけだからです。式の中に try-except を埋め込むことは、Pythonの文法上できません。 現実的な回避策:関数へ処理を委譲する この制限に対する実用的な解決策のひとつが、例外が発生しうる部分式の評価を「関数」に委譲する方法です。関数の中