2011-08-29 4 views
3

나는 적절한 "pythonic"방식으로이 작업을하고 있는지 확인하고 싶다 - 나는이 예외 클래스를 올바르게 정의하고 사용하고있다. 특히 eval (repr()) 논리는 청결을 위해 주로 사용 되었기 때문에 왜 repr() 문자열이 반환되는지 따옴표가 붙지 만 이해하지만 로그하지는 않습니다. 나는 예외가 발생하면이것은 Python 예외를 정의하고 사용하는 적절한 방법입니까?

class IPCClientError(Exception): 
    """ General IPC Client Exception class """ 
    def __init__(self, value = "Unspecified error"): 
     self.val = value + ", see IPC client log for details." 

    def __str__(self): 
     return eval(repr(self.val)) 

, 나는 같은 것을 사용

raise IPCClientError("Socket error") 

을 그리고 호출하는 방법은 다음과 같이해야합니다 :

except IPCClientError, exc: 
    self.log.error(str(exc)) 
    return ERROR 
+0

그래, 예외를 다시 제기해야한다는 것을 제외하고는 올바르게하고 있습니다. –

+0

당신은 맞습니다. 다음에 리팩토링을 할 수있는 기회가 생겼습니다. – Dave

+4

왜'return self.val' 대신'return eval (repr (self.val))'을 사용하고 있습니까? – jamessan

답변

4
eval(repr(self.val)) 

에크를, 무엇을 너 여기서하려고하는거야? self.val은 이미 문자열로되어 있습니까?

repr이 붙이는 따옴표를 피하는 방법은 처음에는 사용하지 않는 것이 좋습니다.

생성자에 전달 된 값이 문자열이 아니 어서 걱정이된다면 어쨌든 생성자 (unicode에도 불구하고)에서 실패하고 사용자 정의 예외가 발생하기 전에 TypeError이 발생합니다. 될 수 있습니다. 당신이 예외를 처리하는 방법에 관해서는

는, 예외 처리는 예술의 일종이며,이 공간에 적용 할 수있다 정말로 뭔가 ... (떨어져 이미 다른 사람에 의해 언급 된 eval 물건에서)

+0

아, 그냥 "이런"순간을 가졌어요! 감사. – Dave

2

except 문에 except IPCClientError as exc: ("로"표시)을 작성해야합니다.이 방법은 더 최신의 python 3 호환 방법입니다. (다른 구문은 파이썬 3에서는 더 이상 작동하지 않으며, 새로운 구문은 파이썬 2.6 이상에서 작동합니다.)

관련 문제