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

Pythonであらゆる例外をキャッチするtry/exceptブロックの正しい書き方

すべての例外をキャッチするのは避けるべき

Pythonでは、以下のように引数なしのexceptを記述することで、発生したすべての例外をキャッチできます。しかし、これは一般的なコーディング規約として推奨されていません

try:
    # do_something()
except:
    print("Exception Caught!")

その理由は、裸のexceptKeyboardInterrupt(Ctrl+Cによる中断)やSystemExitといった、通常は捕捉したくない例外まで拾ってしまうためです。これらの例外を握りつぶすと、プログラムを正常に中断できなくなるなどの問題が発生します。

具体的な例外を指定し、最後に再送出する

実践的なコードでは、想定される例外を個別に指定します。さらに、最後のexceptブロックで予期しない例外を受け取った場合は、すぐにraiseで再送出(re-raise)することで、エラー情報を失わずに上位へ伝播させられます。

import sys

try:
    f = open('file.txt')
    s = f.readline()
    i = int(s.strip())
except OSError as e:
    print("I/O error({0}): {1}".format(e.errno, e.strerror))
except ValueError:
    print("Could not convert data to an integer.")
except Exception:
    print("Unexpected error:", sys.exc_info()[0])
    raise

スクリプトと同じフォルダにfile.txtが存在しない場合、実行結果は次のようになります。

I/O error(2): No such file or directory

押さえておきたいポイント

  • 裸のexceptKeyboardInterruptなども捕捉してしまうため、原則として使わない
  • OSError(旧IOError)やValueErrorなど、想定される例外を個別に指定する
  • 予期しない例外はログに記録してからraiseで再送出すると安全
  • Python 3ではexcept Exception as e:と書くことで、システム終了系の例外を除外しつつ、ほぼすべての例外を扱える
  1. Pythonで文字列から数値だけを抽出する方法|isdigitとリスト内包表記の使い方

    はじめにPythonで文字列の中から数字(数値)だけを取り出したい場面は多くあります。例えば、ユーザー入力やログデータ、テキストファイルから数値情報を取得するケースなどです。このような場合には、リスト内包表記とisdigitメソッドを組み合わせることで、シンプルかつ効率的に実現できます。サンプルコード以下は、文字列から数字を抽出する基本的な実装例です。my_string = python is 12 fun 2 learn print(元の文字列:) print(my_string) my_result = [int(i) for i in my_string.split() if i.i

  2. Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例

    Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実