2009-11-05 4 views
3

나는 main과 notm이라는 두 개의 모듈을 가지고있다. 나는 주 모듈에서 내 사용자 정의 예외를 선언하고 그것을 잡아 싶습니다. 이 예외는 notmain 모듈에서 발생합니다. 문제는 notmain 모듈에서 발생한 예외를 잡을 수 없다는 것입니다.파이썬에서의 사용자 정의 예외 처리

main.py :

class MyException(Exception): 
    pass 

m = __import__('notmain') 
try: 
    m.func() 
except MyException as e: 
    print(type(e)) 
    print('ops') 

notmain.py :

def func(): 
    import main # 1 
    # from main import MyException # 2 
    # from main import MyException as MyException # 3 

    raise main.MyException # 1 
    # raise MyException # 2, 3 

저도 같은 결과 다른 수입 방법을 시도했다. 내가 역 추적을 볼 이유

<class 'main.MyException'> 
ops 
Traceback (most recent call last): 
    File "D:\exception\main.py", line 6, in <module> 
    m.func() 
    File "D:\exception\notmain.py", line 6, in func 
    raise main.MyException # 1 
main.MyException 

이 예외가 어떻게 든 잡힌 의미하지만 : 내가 main.py를 실행하면,이 보여? 왜 예외 클래스는 "main.MyException"이름을 가지고 있습니까? 이제

나는 조금 main.py 수정하고 그것을 실행하는 경우 :

try: 
    raise MyException 
except MyException as e: 
    print(type(e)) 
    print('ops') 

내가 기대 한 것만 볼 수 있습니다 :이 클래스 MyException 다른 이유

<class '__main__.MyException'> 
ops 

는 나도 몰라 main.py 및 notmain.py에있는 이름? 그리고 파이썬이 예상대로 그것을 잡을 수없는 이유는 무엇입니까?

감사합니다 :)

답변

8

모듈 main이 (main__main__로), 각각 자신의 클래스 MyException을 가진 두 번 가져옵니다. 순환 수입을 피하기 위해 신청서를 재 설계해야합니다.

1

__main__ 밑줄이있는 이름은 호출되는 프로그램의 자동 네임 스페이스입니다. 해결 방법은 세 번째 파일에서 예외를 선언하는 것입니다 (또는 사용자 호출 프로그램 인 세 번째 파일과 "실제"프로그램에서 단 하나의 메서드 만 있음).

또한 notmain을 가져 오는 방법과 관련이있을 수 있습니다. 왜 "notmain import func"가 아닌가?

+0

감사합니다. 모듈을 동적으로 가져옵니다 (런타임에만 모듈의 이름을 알고 있습니다). 그래서 __import__가이를 수행하는 유일한 방법입니다. – demalexx