2009-04-16 3 views

답변

25

일반적으로 루트 Exception 객체를 catch하지 않고 대신 특정 예외를 catch하는 것이 좋습니다 (예 : IOException).

메모리 부족 예외가 발생했는지 고려하십시오. 단순히 "통과"를 사용하면 프로그램을 양호한 상태로 유지할 수 없습니다.

예외를 잡아야 할 때가 거의 있습니다. 예외는 프로그램의 최상위 레벨에 있습니다. 오류를 표시하고 오류를 표시하고 정상적으로 종료 할 수 있습니다.

+2

이 나쁜 버릇은 상당한 디버깅 악몽을 생성 할 것입니다.특히 당신이 생각한 것 이외의 예외가 try/except 내부에서 발생했을 때. 그리고 이것은 단순히 발생합니다 ... – vaab

3

너무 많이 붙잡고 있다고 생각하기 때문에. 맞습니다.

1

예외가 발생하면 예외가 발생합니다. 일반적으로 프로그램이 종료되는 것이 좋습니다.

일부 예외는 무시하고 싶지만 IMO에서는 이와 같은 기본 클래스를 잡을만한 이유가 없습니다.

+4

안녕하세요. 나는 '좋은 이유가 없다'는 것에 동의하지 않는다고 생각합니다. 예를 들어, 까다로운 데이터 세트에서 특정 작업을 시도 할 때 예외를 발생시키는 GUI 프로그램을 상상해 볼 수 있습니다. 예기치 않은 예외가 스택 트레이스 (초기에 실패 함)로 프로그램을 끝내야한다고 말하는 프로그래머로서 모두 훌륭하지만 실제로는 사용자가 원하는 것은 현재 작업이 메시지 상자 나 로그 파일 메시지로 정상적으로 실패하는 것입니다. , GUI가 계속해서 작동 할 수 있도록합니다. 나쁜 일이 일어나기 전에 데이터를 저장하십시오. –

+1

전적으로 동의합니다. OP가 '통과'로 예외를 무시하는 방식을 언급했습니다. 나는 내 주장을 분명히해야했다. –

+0

충분히 공평 해주십시오. –

-1

잡기 예외 (다시 제기하지 않음)에는 2 가지의 나쁜 부작용이 있습니다. 즉, 오류가 발생하여 스택 추적을 잃지 만 ctrl-c (또는 운영 체제의 중단 키가 무엇이든지)도 가져옵니다. 여기에서 처리했습니다.

이러한 일반적인 프로그램 동작은 중지 할 수 없거나 ctrl-c를 사용하여 제어 흐름을 예외 처리기로 건너 뛰고 계속 진행하는 것입니다. 그런 다음 코드를 중단하거나 ctrl-c를 눌러 해지해야합니다.

+2

이것은 더 이상 파이썬 2.6에서 사실이 아니며 KeyboardInterrupt는 더 이상 예외를 상속하지 않습니다. –

+0

스택 추적을 잃지 않습니다. sys.exc_info()가있는 'traceback'모듈을 사용하십시오. – PeqNP

15

아주 좁은 범위의 유형 만 잡는 것이 좋습니다. 'Exception'은 너무 일반적입니다. 여러분이 계획 한 오류뿐만 아니라 다른 오류도 잡아낼 수 있습니다. 코드에서 잡히지 않은 경우 진단하는 것이 더 빠를 수있는 버그를 숨길 수 있습니다. 매우 높은 수준의 단일 예외 처리기로 처리하는 것이 더 좋습니다.

파이썬 2.6 이후로, 잡기를 원치 않는 모든 예외 (SystemExit, KeyboardInterrupt)가 Exception에서 더 이상 상속받지 않기 때문에 Exception을 잡는 것이 훨씬 더 합리적이되었습니다. 대신 대신 공통 BaseException을 상속합니다. 이것은 흔히 볼 수있는 관용어이기 때문에 잡을 예외를 상대적으로 무해하게 만들기 위해 의도적으로 수행되었습니다.

& 향후 계획은 PEP 3110을 참조하십시오.

0

그렉의 대답과 같이 'Exception'은 기본 클래스이며 예외는이 클래스에서 파생되어야합니다 (exceptions.Exception 참조). 여기

pydocs 또한

참고 예외가 발생한 위치를 알 수있는 매우 편리한 역 추적 모듈의 오류의 매우 유용한 목록입니다. 'except : ...'만 사용하면 자신의 케이스에서 가장 잘 사용해야하는 오류가 표시됩니다. 예를 들어,이 코드를 사용해보십시오 (코멘트를 토글하십시오). 아마도 이것을 받아 들일 것입니다 :