Python 3で例外チェーンを使う標準的な方法とは?raise ... from構文の使い方を解説
プログラムである例外「A」を処理している最中に、別の例外「B」が発生することは珍しくありません。Python 2では、このような状況が起きると例外Bだけが外側へ伝播し、元の例外Aの情報は失われてしまいました。しかし、問題を正確にデバッグするためには、両方の例外の情報を把握できることが非常に重要です。
例外チェーンが必要になる場面
場合によっては、例外ハンドラの中で意図的に例外を再送出(再スロー)したいことがあります。たとえば、より詳細な情報を付け加えたい場合や、発生した例外を別の種類の例外に変換して呼び出し元に伝えたい場合などです。
こうしたニーズに応えるため、Python 3では__cause__属性が用意されており、例外の直接的な原因を明示的に記録できるようになりました。
Python 3の「raise ... from」構文
例外チェーン(exception chaining)の機能はPython 3でのみ利用可能です。Python 3には、例外を連鎖させるための専用構文として raise ... from 句が導入されています。これにより、「どの例外が原因で新しい例外が発生したのか」という因果関係を明確に示せます。
以下は、raise ... from 句を使って書き直したコード例です。
try:
s = {'a':1, 'b':2}['c']
except KeyError as e:
raise ValueError('failed') from eこのコードでは、辞書に存在しないキー「c」にアクセスしたことでKeyErrorが発生し、それを捕捉した上で、元の例外eを原因としてValueErrorを再送出しています。
実行結果:両方の例外が表示される
Python 3ではデフォルトで、例外処理の過程で発生したすべての例外がトレースバックに表示されます。実際の出力は次のようになります。
Traceback (most recent call last):
File "source_file.py", line 2, in <module>
s = {'a':1, 'b':2}['c']
KeyError: 'c'続いて、元の例外との関係が明示されたメッセージが表示されます。
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "source_file.py", line 4, in <module>
raise ValueError('failed') from e
ValueError: failed「The above exception was the direct cause of the following exception(上記の例外は、以下の例外の直接の原因です)」というメッセージにより、KeyErrorがValueErrorの発生原因であることが一目でわかります。
まとめ
Python 3の raise ... from 構文を使えば、例外処理中に新たな例外が発生しても、元の例外情報が失われることなくトレースバックに残ります。これにより、複雑なエラーの原因追跡が格段に容易になり、デバッグ効率が大幅に向上します。例外を変換・再送出する際には、積極的にこの構文を活用しましょう。
-
PythonとSeleniumでWhatsAppチャットボットを作る方法
はじめに この記事では、Pythonを使ってWhatsAppのチャットボットを作成する方法を解説します。TwitterやFacebook向けの一般的なチャットボットとは異なり、WhatsAppは運営ポリシーの関係上、プラットフォーム上で直接ボットを動かすことができません。 しかし、SeleniumというPythonの強力なパッケージを使えば、ブラウザの操作を自動化することでこれを実現できます。Seleniumを利用すれば、ブラウザ経由で「WhatsApp Web」を自由に操作できるのです。 必要なもの 準備が必要なのは、主に以下の3点です。 1. Selenium Seleniumはpip
-
PythonでのCX_Freezeの使い方:スクリプトを実行ファイル(EXE)に変換する方法
はじめに 何か面白いものを作りたいという欲求は人間の本能であり、完成したものは誰かに共有したくなるものです。Pythonでもその願いを叶えられます。ただし、作成したPythonスクリプトをそのまま共有するには、相手のマシンにも同じバージョンのPythonと、プログラムで使用しているすべてのモジュールがインストールされている必要があります。 そこで役立つのがCX_Freezeです。このツールを使えば、Pythonがインストールされていない環境でも動作するスタンドアロンの実行ファイル(.exe)を作成できます。 CX_Freezeのインストール まず、コマンドプロンプトで以下のコマンドを実行し、c