次の2つのモジュールprog.pyとerr.pyを考慮してください。どちらも、この問題を呈するはるかに大きなプログラムの例です。私は機能をテストベンチを備えた小さなソースファイルに分ける必要があります。例外ハンドラが別のモジュールにある場合の例外
Err.pyにはテストベンチが含まれています。 progオブジェクトを生成するとき、例外がどのように呼び出されるかに応じて、例外がキャッチされるかどうかは不明です。
prog.pyが "from err import *"ステートメントでerrオブジェクトをインポートしたとしても、モジュール名は推測されていますが(間違っていますか?)、それが指すエラーは同じものではないようですモジュール自体
これはPython 2.7のバグですか、それとも意図した動作ですか?
単に最初のファイルの両方のファイルを取得し、私が何を意味するか見るためにerr.pyを実行します。..
:それが思わ
#err.py
import prog
import inspect
import sys
class myError(Exception):
pass
class MySubError(myError):
pass
def doError():
raise MySubError
if __name__=="__main__":
p=prog.prog()
try:
doError()
except MySubError as er:
print type(er)
print "Captured 1"
except Exception as er:
print type(er)
print "Not Captured 1"
try:
p.func1()
except MySubError as er:
print type(er)
print "Captured 2"
except Exception as er:
print type(er)
print "Not captured 2"
try:
p.func2()
except MySubError as er:
print type(er)
print "Captured 3"
except Exception as er:
print type(er)
print "Not captured 3"
:
#prog.py
from err import *
class prog(object):
def func1(self):
raise MySubError
def func2(self):
doError()
そして第二にファイルをまるでどういうわけかerrはモジュールが何であるか知っていて、例外はMySubErrorではなくerr.MySubErrorでなければなりません。
<class '__main__.MySubError'>
Captured 1
<class 'test.MySubError'>
Not captured 2
<class 'test.MySubError'>
Not captured 3
はい私はこれを知っており、意味があります。意味が分からないのは、例外のクラス名を変更することです。私はまだそれの理由を見ることができません。結局のところ、最終的には同じクラスインスタンスです。私はexecを使用していません。モジュール関数testerr.TestError()を使用して、両方のモジュールから呼び出しました。両方のモジュールがグローバルテストモジュールで動作します。 –
Jason:コードを構造化したのと同じクラスインスタンスではありません。おそらくLattyとalexisは私が間違っていると私を修正することができますが、私は信じています: 'prog.py'の中で' '間違ったimport * 'を行っているので、' 'prog'の中の' 'err.py ' py'。そのため、prog.pyでは例外クラスの名前は 'err.MySubError'で、err.pyの内部では' __main __。MySubError'という名前になっています。私はあなたが実際には二つの異なる例外を上げていると信じています。 – alan
@alan、あなたは間違っています。 :-)ある正規モジュールから別の正規モジュールへの例外のインポートは、期待通りに動作しますが、これまでに試してみました。問題は、Pythonがスクリプトがモジュールと同じであることを認識しないことです。私が想像できる唯一の言い訳:スクリプト名は有効なモジュール名である必要はなく、モジュールのインポートパスには場所がないため、Pythonはそれらを追跡する良い方法がありません。 – alexis