Python 3には、例外をチェーンするraise
... from
句があります。Glennの答えはPython 2.7に最適ですが、元の例外のトレースバックのみを使用し、エラーメッセージやその他の詳細を破棄します。以下は、現在のスコープのコンテキスト情報を元の例外のエラーメッセージに追加し、その他の詳細はそのままにしておくPython 2.7の例です。
既知の例外タイプ
try:
sock_common = xmlrpclib.ServerProxy(rpc_url+'/common')
self.user_id = sock_common.login(self.dbname, username, self.pwd)
except IOError:
_, ex, traceback = sys.exc_info()
message = "Connecting to '%s': %s." % (config['connection'],
ex.strerror)
raise IOError, (ex.errno, message), traceback
このフレーバーのraise
ステートメントは、例外タイプを最初の式、タプルの例外クラスコンストラクター引数を2番目の式、トレースバックを3番目の式として受け取ります。Python 2.2より前のバージョンを実行している場合は、の警告を参照してくださいsys.exc_info()
。
例外タイプ
次に、コードがキャッチする必要のある例外の種類がわからない場合のより一般的な目的の例を示します。欠点は、例外の型がなくなり、RuntimeErrorが発生するだけです。traceback
モジュールをインポートする必要があります。
except Exception:
extype, ex, tb = sys.exc_info()
formatted = traceback.format_exception_only(extype, ex)[-1]
message = "Importing row %d, %s" % (rownum, formatted)
raise RuntimeError, message, tb
メッセージを変更する
例外タイプでコンテキストを追加できる場合の別のオプションを次に示します。例外のメッセージを変更してから、再度発生させることができます。
import subprocess
try:
final_args = ['lsx', '/home']
s = subprocess.check_output(final_args)
except OSError as ex:
ex.strerror += ' for command {}'.format(final_args)
raise
これにより、次のスタックトレースが生成されます。
Traceback (most recent call last):
File "/mnt/data/don/workspace/scratch/scratch.py", line 5, in <module>
s = subprocess.check_output(final_args)
File "/usr/lib/python2.7/subprocess.py", line 566, in check_output
process = Popen(stdout=PIPE, *popenargs, **kwargs)
File "/usr/lib/python2.7/subprocess.py", line 710, in __init__
errread, errwrite)
File "/usr/lib/python2.7/subprocess.py", line 1327, in _execute_child
raise child_exception
OSError: [Errno 2] No such file or directory for command ['lsx', '/home']
check_output()
呼び出された行が表示されていることがわかりますが、例外メッセージにはコマンドラインが含まれています。