[python] 모든 예외 잡기

모든 예외를 잡는 try/ except블록을 어떻게 작성할 수 있습니까?



답변

당신은 할 수 있지만 아마해서는 안됩니다 :

try:
    do_something()
except:
    print "Caught it!"

그러나 이것은 또한 예외를 잡을 것이고 KeyboardInterrupt일반적으로 원하지 않는 것입니까? 예외를 즉시 다시 발생 시키지 않으면 문서에서 다음 예제 참조하십시오 .

try:
    f = open('myfile.txt')
    s = f.readline()
    i = int(s.strip())
except IOError as (errno, strerror):
    print "I/O error({0}): {1}".format(errno, strerror)
except ValueError:
    print "Could not convert data to an integer."
except:
    print "Unexpected error:", sys.exc_info()[0]
    raise


답변

베어 except:조항 (다른 사람들이 사용해서는 안된다고 말한 것) 외에도 다음을 간단히 잡을 수 있습니다 Exception.

import traceback
import logging

try:
    whatever()
except Exception as e:
    logging.error(traceback.format_exc())
    # Logs the error appropriately. 

예를 들어 종료하기 전에 포착되지 않은 예외를 처리하려는 경우 일반적으로 코드의 가장 바깥 레벨에서이 작업을 수행하는 것이 좋습니다.

의 장점 except Exception베어 이상은 except그것이 가장 분명 잡을 실 거예요 것을 몇 가지 예외가 있다는 것입니다 KeyboardInterrupt그리고 SystemExit당신이 잡은 그 다음 당신은 당신의 스크립트를 종료하는 사람을 위해 열심히 그것을 만들 수 삼키면 :.


답변

일반적인 예외를 처리하기 위해이 작업을 수행 할 수 있습니다

try:
    a = 2/0
except Exception as e:
    print e.__doc__
    print e.message


답변

가능한 모든 예외를 잡으려면 catch BaseException . 예외 계층 구조의 맨 위에 있습니다.

파이썬 3 :
https://docs.python.org/3.5/library/exceptions.html#exception-hierarchy

파이썬 2.7 :
https://docs.python.org/2.7/library/exceptions.html#exception-hierarchy

try:
    something()
except BaseException as error:
    print('An exception occurred: {}'.format(error))

그러나 다른 사람들이 언급했듯이 일반적으로 특정 경우에만 필요하지 않습니다.


답변

여기에있는 것과 비슷한 매우 간단한 예 :

http://docs.python.org/tutorial/errors.html#defining-clean-up-actions

모든 예외를 잡으려고 시도하는 경우 ‘print “예외를 던질 수있는 조치 수행’대신”try : “문에 모든 코드를 넣으십시오.

try:
    print "Performing an action which may throw an exception."
except Exception, error:
    print "An exception was thrown!"
    print str(error)
else:
    print "Everything looks great!"
finally:
    print "Finally is called directly after executing the try statement whether an exception is thrown or not."

위의 예에서 다음 순서로 출력이 표시됩니다.

1) 예외가 발생할 수있는 조치 수행

2) 마지막으로 예외가 발생했는지 여부에 따라 try 문을 실행 한 직후에 호출됩니다.

3) “예외가 발생했습니다!” 또는 “모두 좋아 보인다!” 예외 발생 여부에 따라

도움이 되었기를 바랍니다!


답변

특히 Python 3.0 이상에서 여러 가지 방법이 있습니다.

접근법 1

이것은 간단한 접근 방법이지만 실제로 어떤 코드 줄이 실제로 예외를 throw하는지 알 수 없으므로 권장되지 않습니다.

def bad_method():
    try:
        sqrt = 0**-1
    except Exception as e:
        print(e)

bad_method()

접근법 2

이 방법은 각 예외에 대한 자세한 정보를 제공하므로 권장됩니다. 다음을 포함합니다 :

  • 코드의 줄 번호
  • 파일 이름
  • 더 자세한 방법으로 실제 오류

유일한 단점은 tracback을 가져와야한다는 것입니다.

import traceback

def bad_method():
    try:
        sqrt = 0**-1
    except Exception:
        print(traceback.print_exc())

bad_method()


답변

방금 Python 2.7에서 예외 이름이 있는지 테스트하기위한이 작은 트릭을 발견했습니다. 때로는 코드에서 특정 예외를 처리 했으므로 해당 이름이 처리 된 예외 목록에 있는지 확인하는 테스트가 필요했습니다.

try:
    raise IndexError #as test error
except Exception as e:
    excepName = type(e).__name__ # returns the name of the exception