4

所以,假设我有 3 个不同的电话叫something,something1something2.

现在,我称之为

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

请注意,在上面的代码中,如果某事失败,something1 和 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
4

6 回答 6

9

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

for func in (something, something1, something2):
    try:
        func()
    except Keyerror as e:
        print e
于 2013-07-23T21:20:34.230 回答
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),或者如果你不想要任何东西,传入None(因为它检查操作是否可调用):

with ignoring(KeyError, action=log): something()
于 2013-07-23T21:23:25.160 回答
2

我会用这样的东西:

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

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

于 2013-07-23T21:22:16.403 回答
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()
于 2013-07-23T22:04:56.097 回答
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)

但是,如果您的任务截然不同,则此方法可能不适用。在某种程度上,您在问“我如何编写高效的代码”,而答案取决于您正在编写的代码。

于 2013-07-23T21:27:30.840 回答
0

在python3中,如果你想输入一个带有args和kwargs的函数,你可以使用下面的代码:

def safe_do(**statement):
    try:
        statement['func'](*statement['args'],**statement['kwargs'])
    except Exception as e:
        print(e)
        print(statement['func'])
        print(statement['args'])
        print(statement['kwargs'])
def divide(a,b):
  print(a/b)
safe_do(func=divide,args=[1,0],kwargs={})

我的 colab notebook中,我展示了它。

于 2021-12-31T02:59:51.530 回答