다음 두 모듈 prog.py 및 err.py를 고려하십시오. 이 두 가지 모두이 문제를 나타내는 더 큰 프로그램의 예입니다. 기능을 테스트 벤치가있는 작은 소스 파일로 분리해야합니다.예외 처리기가 별도의 모듈에있는 예외
Err.py에는 테스트 벤치가 포함됩니다. 예외가 호출되는 방법에 따라 prog 객체를 만들면 예외가 catch됩니다.
"from err import *"문에서 prog.py가 err 객체를 가져 오더라도 모듈 이름이 여전히 추측됩니다 (잘못 되었습니까?)하지만 참조하는 오류가 해당 오류와 같지 않은 것처럼 보입니다. 모듈 자체
이것은 Python 2.7의 버그입니까? 아니면 의도 된 동작입니까?
#prog.py
from err import *
class prog(object):
def func1(self):
raise MySubError
def func2(self):
doError()
그리고 두 번째 파일 :
이#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"
그것은 보인다
단순히
이첫 번째 파일은 .. 두 파일을 얻을 내가 무엇을 의미하는지에 관해 알기 위해 err.py를 실행 마치 어떤 식 으로든 오류가있는 모듈이 무엇인지 알아야하며 예외는 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 내부에서''잘못 가져 오기 * '를하고 있기 때문에 prog.py 내부의''err.py' '에있는 모든 것을 로컬 복사본으로 만듭니다. py'. 그래서 prog.py에서 예외 클래스의 이름은'err.MySubError'이며, err.py 내부에는'__main __. MySubError'라는 이름이 붙습니다. 저는 당신이'raise '가 어디에 있느냐에 따라 실제로 두 가지 예외를 제기한다고 생각합니다. – alan
@alan, 틀렸어. :-) 하나의 일반 모듈에서 다른 모듈로 예외를 가져 오는 것은 예상대로 작동하지만, 나는 그것을 과거에 시도해 보았습니다. 문제는 파이썬이 스크립트가 모듈과 동일하다는 것을 인식하지 못한다는 것입니다. 내가 상상할 수있는 유일한 변명은 : 스크립트 이름은 유효한 모듈 이름 일 필요는 없으며, 모듈 가져 오기 경로에 아무 것도 없다. 그래서 파이썬은 그것들을 추적 할 좋은 방법이 없다. – alexis