LoginSignup
3
4

More than 5 years have passed since last update.

Pythonの例外処理を少し便利に

Posted at

例えば、自作のライブラリで特定の例外を違う例外クラスとして送出したい

ライブラリ用に例外を定義していて、組み込み例外をラップするのが一々面倒くさいシーンで使える?

import functools

class MyException(Exception):
    def __init__(self, original, *args, **kwargs):
        super(MyException, self).__init__(str(original), *args, **kwargs)
        self.original = original

def raise_as(except_classes, target_class):
    def wrapper(f):
        @functools.wraps(f)
        def wrapper_inner(*args, **kwargs):
            try:
                return f(*args, **kwargs)
            except except_classes as e:
                raise target_class(e)
        return wrapper_inner
    return wrapper

@raise_as(IndexError, MyException)
def func(a):
    l = [1,2]
    return l[a]

一つ目はMyException、2つ目はTypeErrorになる

func(3)  # MyException
func('hoge')  # TypeError

例外を補足して返り値を変える

細かい制御は無理。

def try_return(except_classes, value=None):
    def wrapper(f):
        def wrapper_inner(*args, **kwargs):
            try:
                return f(*args, **kwargs)
            except except_classes:
                return value
        return wrapper_inner
    return wrapper

@try_return(ZeroDivisionError, None)
def func(x):
    return 1 / x

print func(1) # 1
print func(0) # None
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4