これは私の質問Hang in Python script using SQLAlchemy and multiprocessingのフォローアップです。その質問で説明したように、Pythonでは例外を回避することは問題になります。これは通常問題ではありませんが、Pythonマルチプロセッシングモジュールでエラーが発生した場合があります。マルチプロセッシングはピクルリングでオブジェクトを動かすため、マルチプロセッシングプロセス内でエラーが発生した場合、その質問に示されているように、プロセス全体がハングアップする可能性があります。例外をキャッチして再呼び上げ
考えられるアプローチの1つは、その問題で説明されているように、すべての問題の例外を修正することです。これは容易ではない。なぜなら、例外が呼ばれる可能性があることを容易に事前に知ることができないからである。代替アプローチ(suggested by lbolla in an answer to the question)は、例外を捕捉し、同等の無害な例外を構築してから再スローすることです。 しかし、私はこれを行う方法が正確にわからない。次のコードを考えてみましょう。
class BadExc(Exception):
def __init__(self, message, a):
'''Non-optional param in the constructor.'''
Exception.__init__(self, message)
self.a = a
import sys
try:
try:
#print foo
raise BadExc("bad exception error message", "a")
except Exception, e:
raise Exception(e.__class__.__name__ + ": " +str(e)), None, sys.exc_info()[2]
except Exception, f:
pass
import cPickle
a = cPickle.dumps(f)
l = cPickle.loads(a)
print "raising error"
raise sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2]
このコードの漬物と例外をunpickles、それを投げ、Glenn Maynard's answer to "“Inner exception” (with traceback) in Python?"にエラーに
raising error
Traceback (most recent call last):
File "<stdin>", line 11, in <module>
Exception: BadExc: bad exception error message
クレジットを与えます。 これには重要なことがあります。つまり、トレースバック、エラーメッセージ、例外の種類です。これが最善の方法です。しかし、理想的に私はむしろException
よりも前に例外の名前を持つ、より一般的に正確に元の例外のようなもの、すなわち
Traceback (most recent call last):
File "<stdin>", line 11, in <module>
__main__.BadExc: bad exception error message
かを、したいと思います。これは可能ですか?
また、代わりにBadExc
クラスで、1はNameError
を与える代わりに、print foo
ステートメントを使用することができます。ただし、この例外は特別な処理を必要としません。
こんにちは、ロブ。回答ありがとうございます。 +1の努力をしていますが、私は実際にこのような方法で 'sys.excepthook'のような「グローバル」なものを使う考えが嫌いです。指摘するように、問題があります。私は、通訳者に、実際に実行できるかどうかわからないが、スローされた例外がいくつかの属性やメソッドを上書きすることによってBadExc型であると考えてしまうような方法があるかもしれないとぼんやりと考えていたそれをやる。 –