Python의 표준 라이브러리 구성 요소에서 예외 메시지를 얻는 가장 좋은 방법은 무엇입니까?
어떤 경우에는 다음 message
과 같은 필드 를 통해 얻을 수 있음을 알았습니다 .
try:
pass
except Exception as ex:
print(ex.message)
그러나 어떤 경우에는 (예 : 소켓 오류의 경우) 다음과 같이해야합니다.
try:
pass
except socket.error as ex:
print(ex)
이러한 상황을 대부분 처리 할 수있는 표준 방법이 있는지 궁금합니다.
답변
내장 오류 에 대한 문서를 보면 대부분의 Exception
클래스가 첫 번째 인수를 message
속성 으로 할당하는 것을 볼 수 있습니다. 하지만 모두가 그렇게하는 것은 아닙니다.
특히 EnvironmentError
(하위 클래스 IOError
및 OSError
)에는의 첫 번째 인수 errno
,의 두 번째 인수 가 strerror
있습니다. 없습니다 message
… strerror
일반적으로 message
.
보다 일반적으로의 하위 클래스는 Exception
원하는 모든 작업을 수행 할 수 있습니다. message
속성 이있을 수도 있고 없을 수도 있습니다 . 향후 내장 Exception
에 message
속성 이 없을 수 있습니다 . Exception
타사 라이브러리 또는 사용자 코드에서 가져온 모든 하위 클래스에는 message
속성 이 없을 수 있습니다 .
이를 처리하는 적절한 방법은 Exception
잡으려 는 특정 하위 클래스 를 식별 한 다음를 사용하여 모든 것 대신 해당 하위 클래스 만 잡은 except Exception
다음 원하는대로 특정 하위 클래스가 정의하는 속성을 활용하는 것입니다.
당신이 print
무언가 를해야한다면 , 나는 그것이 속성 Exception
이 있든 없든, 당신이 원하는 것을 할 가능성이 가장 높다고 생각합니다 message
.
원하는 경우 메시지 속성을 확인할 수도 있습니다. 이처럼 복잡해 보이기 때문에 실제로 제안하지는 않습니다.
try:
pass
except Exception as e:
# Just print(e) is cleaner and more likely what you want,
# but if you insist on printing message specifically whenever possible...
if hasattr(e, 'message'):
print(e.message)
else:
print(e)
답변
@artofwarfare 에서 제공하는 답변을 개선하기 위해 여기에 message
속성 을 확인 하고 인쇄하거나 Exception
객체를 폴백으로 인쇄 하는 더 깔끔한 방법이 있습니다 .
try:
pass
except Exception as e:
print getattr(e, 'message', repr(e))
에 대한 호출 repr
은 선택 사항이지만 일부 사용 사례에서 필요합니다.
업데이트 # 1 :
@MadPhysicist 의 의견에 따라를 호출 해야하는 이유에 대한 증거 repr
가 있습니다. 인터프리터에서 다음 코드를 실행 해보십시오.
try:
raise Exception
except Exception as e:
print(getattr(e, 'message', repr(e)))
print(getattr(e, 'message', str(e)))
업데이트 # 2 :
다음은 Python 2.7 및 3.5에 대한 구체적인 데모입니다. https://gist.github.com/takwas/3b7a6edddef783f2abddffda1439f533
답변
나는 같은 문제가 있었다. 가장 좋은 해결책은 log.exception을 사용하는 것입니다. 그러면 다음과 같은 스택 추적 및 오류 메시지가 자동으로 출력됩니다.
try:
pass
log.info('Success')
except:
log.exception('Failed')
답변
나도 같은 문제가 있었다. 이것을 파헤 치면 Exception 클래스에 예외 args
를 생성하는 데 사용 된 인수를 캡처 하는 속성 이 있음을 발견했습니다 . except가 부분 집합으로 잡을 예외의 범위를 좁 히면, 그것들이 어떻게 생성되었는지, 그리고 어떤 인수가 메시지를 포함하는지 결정할 수 있어야합니다.
try:
# do something that may raise an AuthException
except AuthException as ex:
if ex.args[0] == "Authentication Timeout.":
# handle timeout
else:
# generic handling