2

この記事http://docs.python.org/2/tutorial/errors.htmlを2回読んで確認しました。トピックを完全に回避します。

  1. Exceptionorではないものをスローしようとしましたが、インタープリターは、 -esque および古いスタイルのクラスのオブジェクトExceptionBaseのみをスローできると言いました。ExceptionBase
  2. だから私は古いスタイルのクラスのオブジェクトを投げてみました:

>>> class Foo():
...     pass
... 
>>> try:
...     raise Foo()
... except Exception as foo:
...     print 'foo %s' % foo
... except:
...     print 'not an exception'
... else:
...     print 'it\'s all good'
... 
not an exception
>>> 

びっくり… では、どうやってそれらをすべて捕まえて、何が捕まえられたのかを調べますか?

編集:

動機。

  1. 過度に防御的なコーディングは決して悪い習慣ではありません。私がデーモンプログラムを書いていると仮定すると、他の基準では取るに足らないことをすることによって、可能な限り多くの潜在的な危険を防ごうとしないのはなぜでしょうか?
  2. プログラムは常に友好的な環境で実行されるとは限りません。他のプログラムがあなたのプログラムを危険にさらそうとすることがあります。そのような場合、あらゆる種類のエラーを防止する必要があります。時々それは理にかなっています。たとえば、CGI の実装について考えてみてください。サーバーの一部を借りたばかがサーバーにスクリプトを入れて、この「予期しない」エラーをスローした場合、サーバー全体をダウンさせたいですか?
  3. 一部のフレームワークは既にすべてのエラーをキャッチしているため、フレームワーク コードのレイヤーの下からメッセージを取得するのは簡単ではありません。フレームワーク コードがキャッチしていないものをスローすることは、それをバイパスするための良い戦略かもしれません (これは単なる理論的なケースではありません。私は以前にそうしました)。
4

1 に答える 1

3

import types

try:
    raise Foo()
except (Exception, types.InstanceType) as foo:
    print 'foo %s' % foo
else:
    print 'it\'s all good'

編集:

それはうまくいくように感じますが、そうではありません。ハックな方法は次のとおりです。

import sys

try:
    raise Foo()
except:
    etype, foo, traceback = sys.exc_info()
    print 'foo %s' % foo
else:
    print 'it\'s all good'
于 2012-11-09T21:58:07.227 に答える