4

私は何かをチェックし、それができる方法を持っています

  • 例外自体を発生させる
  • Trueを返す
  • Falseを返します

自分で例外を発生させるために例外を適切にキャッチしたいのですが、テストでFalseが返された場合も同様です。これを行うための間違った方法は

try:
    if not check():
        raise MyException()
except:
    raise MyException()

最初のものが再びMyException捕らえられるように。exceptこれを適切に処理する1つの方法は

try:
    flag = check()
except:
    raise MyException()
else:
    if not flag:
        raise MyException()

これがこの状況に対処する唯一の方法ですか、flagそれとも変数を取り除くことでより効率的に処理する別の方法がありますか?

4

3 に答える 3

10

SystemExitを含むすべての例外をキャッチするため、次の場合を除いて使用しないでください。

try:
    if not check():
        raise MyNewException()
except ExceptionRaisedByCheck:
    raise MyNewException()

check()からの例外が発生させたい例外と同じである場合は、それを変更する必要があります。

編集:例外が同じである場合は、これを行うこともできます(Mark Byersは彼の回答にこれを持っていましたが、現在はなくなっています):

if not check():
    raise TheSameException()

これにより、例外が伝播されるか、Falseの場合に発生します。

于 2012-10-04T09:27:36.303 に答える
2
try:
   # whatever
except MyException:
   raise # reraise it
except Exception as e:
   raise MyException(some_info(e)) # unify user-visible exception type
于 2012-10-04T09:23:43.103 に答える
1

contextlib.ExitStackPython 3.3では、新しいコンテキストマネージャーを使用できます。

with ExitStack() as stack:
    stack.callback(lambda: raise MyException)

    if check():
        stack.pop_all()

でスタックコールバックをクリアしない限りMyException、これにより、が発生します。pop_all()

これをカスタムコンテキストマネージャーに体系化できます。

from contextlib import ExitStack

class ExceptionUnlessCancelled(ExitStack):
    def __init__(self, exception, *args, **kw):
        super(Callback, self).__init__()
        self.exception = exception
        self.callback(self.raiseException, *args, **kwds)

    def raiseException(self, *args, **kw):
        raise self.exception(*args, **kw)

    def cancel(self):
        self.pop_all()

with ExceptionUnlessCancelled(MyException) as exc:
    if check():
        exc.cancel()
于 2012-10-04T09:27:31.047 に答える