[python] Python에서 예외 메시지를 올바르게 얻는 방법

Python의 표준 라이브러리 구성 요소에서 예외 메시지를 얻는 가장 좋은 방법은 무엇입니까?

어떤 경우에는 다음 message과 같은 필드 를 통해 얻을 수 있음을 알았습니다 .

try:
  pass
except Exception as ex:
  print(ex.message)

그러나 어떤 경우에는 (예 : 소켓 오류의 경우) 다음과 같이해야합니다.

try:
  pass
except socket.error as ex:
  print(ex)

이러한 상황을 대부분 처리 할 수있는 표준 방법이 있는지 궁금합니다.



답변

내장 오류 에 대한 문서를 보면 대부분의 Exception클래스가 첫 번째 인수를 message속성 으로 할당하는 것을 볼 수 있습니다. 하지만 모두가 그렇게하는 것은 아닙니다.

특히 EnvironmentError(하위 클래스 IOErrorOSError)에는의 첫 번째 인수 errno,의 두 번째 인수 가 strerror있습니다. 없습니다 messagestrerror일반적으로 message.

보다 일반적으로의 하위 클래스는 Exception원하는 모든 작업을 수행 할 수 있습니다. message속성 이있을 수도 있고 없을 수도 있습니다 . 향후 내장 Exceptionmessage속성 이 없을 수 있습니다 . 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


답변