Python에서 except :와 예외 e :를 제외하는 것의 차이점


140

다음 코드 스 니펫은 모두 동일한 작업을 수행합니다. 그들은 모든 예외를 포착하고 except:블록 에서 코드를 실행합니다.

스 니펫 1-

try:
    #some code that may throw an exception
except:
    #exception handling code

스 니펫 2-

try:
    #some code that may throw an exception
except Exception as e:
    #exception handling code

두 구성의 차이점은 무엇입니까?


7
@ user2725093 같은 질문이 아닙니다. 당신이 연결된 하나의 차이 무엇을 요구 except Exception, e:하고 except Exception as e:. 이 질문은 차이가 사이에 무엇을 요구 except:하고 except Exception as e:.
Dennis

답변:


155

두 번째로 예외 객체의 속성에 액세스 할 수 있습니다.

>>> def catch():
...     try:
...         asd()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
global name 'asd' is not defined ("global name 'asd' is not defined",)

하지만 잡을 수없는 BaseException또는 시스템 종료 예외 SystemExit, KeyboardInterruptGeneratorExit:

>>> def catch():
...     try:
...         raise BaseException()
...     except Exception as e:
...         print e.message, e.args
... 
>>> catch()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in catch
BaseException

다음을 제외한 맨손 :

>>> def catch():
...     try:
...         raise BaseException()
...     except:
...         pass
... 
>>> catch()
>>> 

자세한 정보는 문서 의 내장 예외 섹션 학습서 의 오류 및 예외 섹션을 참조하십시오.


22
글쎄, 여기 마법이 없습니다. Exception에서 파생 된 것이므로 catch하지 않는 BaseException이유 입니다. 당신이 쓰면 너무 잡힐 것입니다. 베어 는 모든 것을 잡는다. except ExceptionBaseExceptionexcept BaseExceptionexcept
fjarri

2
베어 except는 일련의 except블록 에서 마지막이어야하며 except Exception다른 except블록 앞에 놓으면 오류가 발생하지 않습니다 Exception. 하위 클래스 를 처리하는 경우 자동으로 무시 됩니다. 조심해야 할 것.
바네사 핍스

@MatthewPhipps 요점은 그렇지 않습니까? case 문이나 if-else 블록과 같이 실행은 다음과 일치하는 첫 번째 조건으로 이동합니다.
Basic

1
@Basic 그냥 베어의 또 다른 차이점 지적 exceptexcept Exception. "주의해야 할 것"은 이제 조금 이상해 보이지만, 당시에는 파이썬 except이 위치에 관계없이 가장 구체적인 블록 을 선택할 것으로 예상했지만 그렇지 않은 경우 조금 실망했습니다.
Vanessa Phipps

두 번째 형식은 예외가 무엇인지 신경 쓰지 않거나 의미있는 방식으로 처리하려는 경우에만 사용해야한다는 점에 주목할 가치가 있습니다.
Josh J

51
except:

모든 예외를 수용 하는 반면

except Exception as e:

단지 당신이하고 있다는 예외 허용 을 의미 캐치에 있습니다.

다음은 잡으려고 의도하지 않은 예입니다.

>>> try:
...     input()
... except:
...     pass
... 
>>> try:
...     input()
... except Exception as e:
...     pass
... 
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyboardInterrupt

첫 번째는 침묵했다 KeyboardInterrupt!

빠른 목록은 다음과 같습니다.

issubclass(BaseException, BaseException)
#>>> True
issubclass(BaseException, Exception)
#>>> False


issubclass(KeyboardInterrupt, BaseException)
#>>> True
issubclass(KeyboardInterrupt, Exception)
#>>> False


issubclass(SystemExit, BaseException)
#>>> True
issubclass(SystemExit, Exception)
#>>> False

그 중 하나를 잡으려면 최선을 다하는 것이 가장 좋습니다

except BaseException:

당신이하고있는 일을 알고 있다고 지적합니다.


모든 예외는 유래 BaseException, 그리고 그 당신이 (던져 질 것이다 것과 일상 캐치에 의미있는 위해 프로그래머가)에서 너무 상속 Exception.


except(Exception)절대 KeyboardInterrupt오류를 잡지 않습니다. as e그것과 관련이 없습니다.
pandita

2
나는 그런 말을 한 적이 없다. 나는 as e그것이 한 것이 분명하다고 가정하기 때문에 한 번 언급하지 않았습니다 .
Veedrac

2
사람이 BaseException을 잡아서 그들이하는 일을 알고있는 경우가 있습니까?
Davos

2
@Davos 예, 일시적인 로깅을 수행 할 때 또는 사용자에게 예외를 원하지 SystemExit않거나 KeyboardInterrupt탈출 하지 않으려는 콘솔을 제공하는 경우 선호 할 수 있습니다 . 일반적인 경우는 아니지만 발생합니다.
Veedrac

14

KeyboardInterrupt와 같은 몇 가지 예외가 있습니다.

PEP8 읽기 :

bare except : 절은 SystemExit 및 KeyboardInterrupt 예외를 포착하여 Control-C로 프로그램을 인터럽트하기 어렵게 만들고 다른 문제를 위장 할 수 있습니다. 프로그램 오류를 알리는 모든 예외를 포착하려면 Exception :를 제외하고 사용하십시오 (Bare 제외는 BaseException : 제외와 동일 함).


3

두 번째 형식을 사용하면 예외 개체가 바인딩 된 블록 범위에 변수 ( as예 : 절에 따라 이름이 지정됨 e)가 except생겨 예외 (유형, 메시지, 스택 추적 등)의 정보를 사용할 수 있습니다. 보다 특별하게 조정 된 저택에서 예외를 처리하십시오.


1

이것을 보는 또 다른 방법. 예외 세부 사항을 확인하십시오.

In [49]: try: 
    ...:     open('file.DNE.txt') 
    ...: except Exception as  e: 
    ...:     print(dir(e)) 
    ...:                                                                                                                                    
['__cause__', '__class__', '__context__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__suppress_context__', '__traceback__', 'args', 'characters_written', 'errno', 'filename', 'filename2', 'strerror', 'with_traceback']

'as e'구문을 사용하여 액세스 할 수있는 "사물"이 많이 있습니다.

이 코드는이 인스턴스의 세부 정보 만 보여주기위한 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.