一种更简洁的方法来接近尝试,除了在python中

时间:2013-07-23 21:14:24

标签: python exception try-catch

所以,假设我有3个不同的来电,分别是somethingsomething1something2

现在,我称之为

try:
   something
   something1
   something2
except Keyerror as e:
   print e

请注意,在上面的代码中,如果某些内容失败,则yes1和something2将不会被执行,依此类推。

想要的结果是

try:
    something
except KeyError as e:
    print e
try:
    something1
except KeyError as e:
    print e
try:
    something2
except KeyError as e:
    print e

如果没有那么多尝试除了块之外我怎样才能实现上述代码。

修改

所以,我选择的答案是正确的。但其他一些人也表现得很好。我选择了它,因为它是简单的,我修改了一点。

以下是基于答案的解决方案。

runs = [something, something1, something2]
for func in runs:
    try:
        func()
    except Keyerror as e:
        print e

5 个答案:

答案 0 :(得分:8)

你可以尝试这个,假设你在函数中包装:

for func in (something, something1, something2):
    try:
        func()
    except Keyerror as e:
        print e

答案 1 :(得分:5)

这是我用于类似情况的一个小上下文管理器:

from contextlib import contextmanager

@contextmanager
def ignoring(*exceptions):
    try:
        yield
    except exceptions or Exception as e:
        print e

with ignoring(KeyError):
    something()

# you can also put it on the same line if it's just one statement
with ignoring(KeyError): something1()

with ignoring(KeyError): something2()

Python 3版本可以让你参数化发生异常时要做的事情(这里需要关键字参数):

from contextlib import contextmanager

@contextmanager
def ignoring(*exceptions, action=print):
    try:
        yield
    except exceptions or Exception as e:
        callable(action) and action(e)

然后你可以传递除print之外的一些函数(例如记录器,假设是一个名为log的函数),或者如果你不需要任何东西,可以传入{{1} (因为它检查操作是否可调用):

None

答案 2 :(得分:1)

我会选择这样的东西:

def safe_do(*statements):
    for statement, args, kwargs in statements:
        try:
            statement(*args, **kwargs)
        except KeyError as e:
            print e

# usage:
safe_do(
        (something1, [], {}),
        (something2, [], {}),
        )

但是如果你期望在陈述中只丢失一个元素而不是为什么不if呢?

if some_key1 in some_dict1:
    something1

if some_key2 in some_dict2:
    something2

更具可读性,没有任何魔法

答案 3 :(得分:1)

其他可能性

def mydec(func):
  def dec():
    try:
      func()
    except KeyError as e:
      print(e)
  return dec

@mydec
def f1():
  print('a')

@mydec
def f2():
  print('b')
  raise KeyError('Test')

f1()
f2()

答案 4 :(得分:0)

这在很大程度上取决于您是否正在执行类似的任务或完成不同的任务。例如,如果您的something行非常相似,则可以执行以下操作:

def something(my_dict):
    try:
        d = my_dict['important_key']  # Just an example, since we
        return d                      # don't know what you're really doing
    except KeyError as e:
        print e

something(dict1)
something(dict2)
something(dict3)

但是,如果您的任务大不相同,则此方法可能不适用。在某种程度上,你会问“我如何编写有效的代码”,答案取决于你所编写的代码。