2016-10-17 2 views
0

파이썬 3에서 다음 예외가 어떻게 초기화되는지 혼란 스럽습니다.기본 예외가 초기화되는 방법은 무엇입니까?

파이썬 3에서
class MyException(Exception): 

    def __init__(self,msg,foo): 
     self.foo = foo 

raise MyException('this is msg',123) 

이 출력 :

Traceback (most recent call last): 
    File "exceptionTest.py", line 7, in <module> 
    raise MyException('this is msg',123) 
__main__.MyException: ('this is msg', 123) 

어떻게 인수가 초기화 얻고있다? 나는 슈퍼 클래스 이니셜 라이저를 호출하지 않기 때문에 트랙백에 args가 표시되는 것에 놀랐다.

파이썬 2에서는 args가 추적 코드에 포함되어 있지 않기 때문에 다음과 같은 결과가 표시됩니다.

Traceback (most recent call last): 
    File "exceptionTest.py", line 7, in <module> 
    raise MyException('this is msg',123) 
__main__.MyException 

답변

2

파이썬 BaseException 클래스는 오류의 일반적인 경우를 처리하기 위해 특별히 거기에 넣어하는 __new__ 방법을 갖는 것을 특별하다.

아니요, BaseException.__init__은 호출되지 않지만 BaseException.__new__입니다. 당신은 self.args의 설정을 억제하기 위해 전달 된 인수를 __new__을 무시하고 무시 할 수

>>> class MyException(Exception): 
...  def __new__(cls, *args, **kw): 
...   return super().__new__(cls) # ignoring arguments 
...  def __init__(self,msg,foo): 
...   self.foo = foo 
... 
>>> MyException('this is msg', 123) # no need to raise to see the result 
MyException() 

이 또한 파이썬 3에 고유 파이썬 2의 동기와 자세한 내용은 issue #1692335를 참조 존재하지 않습니다.

관련 문제