所以,假设我有3个不同的来电,分别是something
,something1
和something2
。
现在,我称之为
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
答案 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)
但是,如果您的任务大不相同,则此方法可能不适用。在某种程度上,你会问“我如何编写有效的代码”,答案取决于你所编写的代码。