🐍

Pythonで except not in (A, B) とは書けませんか?

2020/10/06に公開

試したこと

class MindError(Exception): pass
class BodyError(Exception): pass


try:
    raise MindError("精神をもっと集中してください")
except not in (MindError, BodyError) as e:
    raise e

# なにも raise されずに後続処理が行われることを期待

動かしてみた結果はこうなりました

SyntaxError: invalid syntax

うまく動きませんでした。なので、こう変えてみました

class MindError(Exception): pass
class BodyError(Exception): pass
IGNORE_EXCEPTIONS = (MindError, BodyError)


def dosomething(error: Exception):
    try:
        raise error
    except Exception as e:
        if isinstance(e, IGNORE_EXCEPTIONS):
            print(f"{type(e).__name__}が起きましたが無視します")
        else:
            raise e

出力を確認してみます。

>>> dosomething(ValueError("想定外の値です"))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 8, in dosomething
  File "<stdin>", line 3, in dosomething
ValueError: 想定外の値です

>>> dosomething(MindError("精神をもっと集中してください"))
MindErrorが起きましたが無視します

いや、別にそんな風にかかなくても、こんな感じでよさそう

class MindError(Exception): pass
IGNORE_EXCEPTIONS = (MindError, BodyError)


def dosomething(error: Exception):
    try:
        raise error
    except IGNORE_EXCEPTIONS as e:
        print(f"{type(e).__name__}が起きましたが無視します")
    except Exception as e:
        # なにかしたいことをする
        raise e

Discussion