当前位置:  开发笔记 > 编程语言 > 正文

Python中的通用异常处理"正确的方法"

如何解决《Python中的通用异常处理"正确的方法"》经验,为你挑选了2个好方法。

有时我发现自己处于需要执行多个顺序命令的情况:

try:
    foo(a, b)
except Exception, e:
    baz(e)
try:
    bar(c, d)
except Exception, e:
    baz(e)
...

只需要忽略异常时就会出现相同的模式.

这感觉多余,并且过多的语法使得在阅读代码时难以理解.

在C中,我很容易用宏来解决这类问题,但不幸的是,这不能在直接的python中完成.

问题:在遇到这种模式时,如何才能最好地减少代码占用空间并提高代码可读性?



1> Ryan..:

如果你有python 2.5,你可以使用该with语句

from __future__ import with_statement
import contextlib

@contextlib.contextmanager
def handler():
    try:
        yield
    except Exception, e:
        baz(e)

您的示例现在变为:

with handler():
    foo(a, b)
with handler():
    bar(c, d)



2> Jonny Buchan..:

如果总是这样,当特定函数引发异常时,你总是想要的行为,你可以使用一个装饰器:

def handle_exception(handler):
    def decorate(func):
        def call_function(*args, **kwargs):
            try:
                func(*args, **kwargs)
            except Exception, e:
                handler(e)
        return call_function
    return decorate

def baz(e):
    print(e)

@handle_exception(baz)
def foo(a, b):
    return a + b

@handle_exception(baz)
def bar(c, d):
    return c.index(d)

用法:

>>> foo(1, '2')
unsupported operand type(s) for +: 'int' and 'str'
>>> bar('steve', 'cheese')
substring not found

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有