2016-06-21 2 views
2

파이썬 2.7.10은 예외에서 throw 될 때 문자열을 튜플로 변환하는 것으로 보입니다. 내 예가 여기에 있습니다 :예외에서 파이썬 문자열이 튜플로 변환되었습니다.

class MyError(RuntimeError): 
    def __init__(self, arg): 
     self.args = arg 

def raiseMyError(): 
    errorCode = 29 
    errorText = 'Port not ready yet' 
    exitCodeMessage = 'ERROR {0}: {1}'.format(errorCode, errorText) 
    # print exitCodeMessage --> print out here and it's a string 
    raise MyError(str(exitCodeMessage)) 

try: 
    raiseMyError() 

except MyError as e: 
    print e.args 

나는 오류 코드와 설명이 포함 된 문자열을 만들고이를 사용하여 목적으로 만들어진 예외 클래스를 작성합니다. 나는 예외가 생성되기 전에 exitCodeMessage 변수를 인쇄 할 때 내가 기대하는 것을 얻을 :

('E', 'R', 'R', 'O', 'R', ' ', '2', '9', ':', ' ', 'P', 'o', 'r', 't', ' ', 'n', 'o', 't', 
' ', 'r', 'e', 'a', 'd', 'y', ' ', 'y', 'e', 't') 

사람 수 :

ERROR 29: Port not ready yet 

그러나, 예외 핸들러 내에서 추적이 다음 나에게 준다 여기에 무슨 일이 일어나고 있는지, 내가 그것에 대해 할 수있는 일을 말해 주시겠습니까? 행동에 관한

class MyError(RuntimeError): 
    pass 

-argsdocs 상태에 있음 : : 사실

+0

'클래스 MyError (RuntimeError에) :하다고 –

답변

2

당신이 전혀 __init__ 메소드를 오버라이드 (override) 할 필요가 없습니다, 그것은 충분한 것으로 충분

The tuple of arguments given to the exception constructor.

당신이 상속하는 경우 Exception 클래스 또는 그 중 자식이 e.args 인 경우 args 속성이 이와 같이 정의되어 있기 때문에 tuple(e.args)을 단순히 인쇄합니다. Exception 클래스에 있습니다 (@ advance512 답변 참조).

당신이 Exception에서 상속하지 않습니다 :

class MyError: 

    def __init__(self, arg): 
     self.args = arg 

당신이 이렇게 예상대로 작동합니다 e.args를 호출의 args 뒤에 "마법"을 상속하지 않습니다.

class MyError(RuntimeError): 

    def __init__(self, arg): 
     self.arg = arg 

예상대로 e.arg도 작동 전화 :

또한 다음과 같이 쓸 수있다 (self.arg에게 대신 의 self.args주의).

+0

을 pass' 참된. 그러나이 경우 왜 변환을하는지 이해하는 데 관심이 있습니다. RuntimeError를 상속받지 않고 나머지 코드를 그대로 사용하면 잘 동작하므로 RuntimeError가 원인이 될 수 있습니다. –

+0

'RuntimeError' 또는'Exception'에서 상속 받았는지 여부는 동일합니다. – matino

+0

나는'MyError'가 어떤 것 (즉,'class MyError :')으로부터 상속받지 않도록 코드를 변경해야한다고 분명히 밝혀야했고, 예상대로 작동했습니다. 당신이 말하는 것처럼, 내 '__init__'은 여기에 필요하지 않습니다. –

2

args는 BaseException 클래스에 정의 된 속성이기 때문입니다.

체크 아웃 exceptions.py:70 :

args = property(lambda self: tuple())

이 시도 :

class MyError(RuntimeError): 
    def __init__(self, errorString): 
     self._errorString = errorString 

def raiseMyError(): 
    errorCode = 29 
    errorText = 'Port not ready yet' 
    exitCodeMessage = 'ERROR %s: %s' % (errorCode, errorText) 
    # print exitCodeMessage --> print out here and it's a string 
    raise MyError(exitCodeMessage) 

try: 
    raiseMyError() 

except MyError as e: 
    print e._errorString 
    print e.args 

출력 :

ERROR 29: Port not ready yet 
() 
관련 문제