Pythonであらゆる例外をキャッチするtry/exceptブロックの正しい書き方
すべての例外をキャッチするのは避けるべき
Pythonでは、以下のように引数なしのexceptを記述することで、発生したすべての例外をキャッチできます。しかし、これは一般的なコーディング規約として推奨されていません。
try:
# do_something()
except:
print("Exception Caught!")
その理由は、裸のexceptがKeyboardInterrupt(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
押さえておきたいポイント
- 裸の
exceptはKeyboardInterruptなども捕捉してしまうため、原則として使わない OSError(旧IOError)やValueErrorなど、想定される例外を個別に指定する- 予期しない例外はログに記録してから
raiseで再送出すると安全 - Python 3では
except Exception as e:と書くことで、システム終了系の例外を除外しつつ、ほぼすべての例外を扱える
-
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
-
Pythonでパターンを出力する方法|三角形・数字・アルファベット・ピラミッドのコード例
Pythonでパターンを出力するには、ネストされた(入れ子構造の)forループを使用します。外側のループで行数を制御し、内側のループで列数を処理します。そしてprint文を工夫することで、目的に応じたさまざまなパターンを作成できます。パターンには、星(アスタリスク)パターン、数字パターン、アルファベットパターンなどがあり、三角形やピラミッドなど、さまざまな形状にも対応できます。パターン出力の基本これらのパターンは、print文を少し変更しながらforループを組み合わせることで出力できます。基本的な考え方はどのパターンも共通しており、違いはごくわずかです。ここからは、代表的なパターンのコードを実