Python异常控制/流问题

2024-04-25 09:36:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在Python中工作,遇到了一些很常见的情况。 我有五个陈述都陷入了一个共同的陷阱 FooException和BarException。我要管理他们每一个 这些异常,但即使在之后引发异常也会继续处理 做了一些处理。现在,我可以这样做:

try:
    foo()
except (FooException, BarException):
    pass
try:
    bar()
except (FooException, BarException):
    pass
try:
    baz()
except (FooException, BarException):
    pass
try:
    spam()
except (FooException, BarException):
    pass
try:
    eggs()
except (FooException, BarException):
    pass

但这确实是冗长的,而且是对DRY的极端违反。相当野蛮的力量 显而易见的解决方案是这样的:

^{pr2}$

其用法如下:

>>> results = wish_i_had_macros_for_this(
                ['foo()','bar()','baz','spam()','eggs()'],
                ['FooException','BarException'],
                globals(),
                locals())
[None,None,None,SpamException,None]

有更好的方法吗?在


Tags: nonefoobar情况passbazspameggs
3条回答
def execute_silently(fn, exceptions = (FooException, BarException)):
    try:
        fn()
    except Exception as e:
        if not isinstance(e, exceptions):
            raise

execute_silently(foo)
execute_silently(bar)
# ...
# or even:
for fn in (foo, bar, ...):
    execute_silently(fn)

此版本还允许执行语句:

from contextlib import contextmanager
from functools import partial

@contextmanager
def exec_silent(exc=(StandardError,)):
    try:
        yield
    except exc:
        pass

silent_foobar = partial(exec_silent, (FooException, BarException))

with silent_foobar():
    print 'foo'
    foo()
with silent_foobar():
    print 'bar'
    bar()

这个怎么样?在

 #!/usr/bin/env python

 def foo():
     print "foo"

 def bar():
     print "bar"

 def baz():
     print "baz"

 for f in [foo, bar, baz]:
     try:
         f()
     except (FooException, BarException):
         pass 

相关问题 更多 >