Pythonのexcept:とexcept Exception as 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

回答:


154

2番目では、例外オブジェクトの属性にアクセスできます。

>>> 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か、システム終了の例外SystemExitKeyboardInterruptおよびGeneratorExit

>>> 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()
>>> 

詳細については、ドキュメントの組み込みの例外セクションとチュートリアルのエラーと例外セクションをご覧ください。


21
まあ、ここには魔法はありません。Exceptionはから派生しBaseExceptionているため、except ExceptionがキャッチされませんBaseException。と書けばexcept BaseException捕まってしまいます。ベアはexceptすべてをキャッチします。
fjarri 2013

2
ベアexceptは一連のexceptブロックの最後にある必要があることを指摘しておく必要がありますが、except Exception他のexceptブロックの前に置いてもエラーは発生しません:それらはサイレントに無視されます(Exceptionサブクラスを処理する場合)。気をつけるべきこと。
ヴァネッサフィップス

@MatthewPhippsそれは一種のポイントですね。caseステートメントやif-elseブロックのように、実行は一致する最初の条件にジャンプします...
基本

1
@Basicだけでは裸の間に別の違いを指摘exceptし、をexcept Exception。「気をつけるべきこと」は少し奇妙に見えますが、当時は、Python exceptがどこにあるかに関係なく、最も具体的なブロックを選択することを期待し、それ以外の場合は少しがっかりしました。
ヴァネッサフィップス2014

2番目の形式は、例外が何であるかを気にしない場合、または例外を意味のある方法で処理する場合にのみ使用する必要があることにも注意してください。
ジョシュ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それとは何の関係もありません。
パンディータ2013

2
そんなことを言ったことは一度もない。as e何をするのかは明らかだと思ったので、については一度も触れていません。
Veedrac 2013

2
人がBaseExceptionをキャッチし、何をしているのかを知っているケースはありますか?
ダボス

2
@Davosええ、一時的なロギングを行うときや、例外を望まない、SystemExitまたはKeyboardInterruptエスケープしたくないコンソールをユーザーに提供する場合は、そうするかもしれません。一般的なケースではありませんが、それは起こります。
Veedrac

14

たとえば、KeyboardInterruptなどのいくつかの例外を除き、違いがあります。

PEP8を読む:

ベアのexcept:句はSystemExitおよびKeyboardInterrupt例外をキャッチし、Control-Cでプログラムを中断することを困難にし、他の問題を偽装することができます。プログラムエラーを通知するすべての例外をキャッチする場合は、except Exception:を使用します(bare exceptはexcept BaseException:と同等です)。


3

2番目の形式を使用すると、例外オブジェクトがバインドされたブロックスコープ内の変数(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.