Python 重复尝试和例外条款
我已经创建了一系列函数,所有函数中都需要非常相似的except子句,但我讨厌在每个函数中有这么多行try和except子句以及相同的代码。例如:Python 重复尝试和例外条款,python,try-catch,except,Python,Try Catch,Except,我已经创建了一系列函数,所有函数中都需要非常相似的except子句,但我讨厌在每个函数中有这么多行try和except子句以及相同的代码。例如: import sys import random def foo(): num=random.random() try: if num>0.5: print 'OK' elif num>0.25: raise NameError('Too Small') else: rais
import sys
import random
def foo():
num=random.random()
try:
if num>0.5: print 'OK'
elif num>0.25: raise NameError('Too Small')
else: raise KeyboardInterrupt
except NameError:
print "%s had a NameError" % sys._getframe().f_code.co_name
except:
print "%s had a different Error" % sys._getframe().f_code.co_name
def bar():
num=random.random()
try:
if num>0.8: print 'OK'
elif num>0.6: raise NameError('Too Small')
else: raise KeyboardInterrupt
except NameError:
print "%s had a NameError" % sys._getframe().f_code.co_name
except:
print "%s had a different Error" % sys._getframe().f_code.co_name
函数的“try”后的代码不同,但“except”后的代码相同。我想合并那些语句,这样它们就不会使我的代码看起来太狭窄。有什么好办法吗?就是你想要的
你说过除块总是一样的。做一个定制的装饰,做你想要的。您必须将此应用于每个函数/方法,但它确实可以避免重复
def handleError(function):
def handleProblems():
try:
function()
except Exception:
print "Oh noes"
return handleProblems
@handleError
def example():
raise Exception("Boom!")
调用应用了decorator的方法时:
>>>
>>> example()
Oh noes
>>>
>>>
>>>示例()
哦,不
>>>
您将需要更改异常类型以及所做的操作,但您将获得我将要使用的jist。您的
try
块中的内容是有趣的内容,因此应该在函数中。然后只需选择您想要的函数,并调用它,由您的异常包装。您甚至可以将异常代码作为函数编写,并将所选函数作为参数传递给它。e、 g
def foo():
num=random.random()
if num>0.5: print 'OK'
elif num>0.25: raise NameError('Too Small')
else: raise KeyboardInterrupt
def bar():
num=random.random()
if num>0.8: print 'OK'
elif num>0.6: raise NameError('Too Small')
else: raise KeyboardInterrupt
def try_numerics(f):
try:
f()
except NameError:
print "%s had a NameError" % sys._getframe().f_code.co_name
except:
print "%s had a different Error" % sys._getframe().f_code.co_name
# In your main code...
if (need_to_run_foo):
try_numerics(foo)
elif (need_to_run_bar):
try_numerics(bar)
如果这些是您的实际函数,那么很容易对它们进行概括 您可以创建一个通用函数
def general(bottom_num, top_num):
num=random.random()
try:
if num>top_num: print 'OK'
elif num>bottom_num: raise NameError('Too Small')
else: raise KeyboardInterrupt
except NameError:
print "%s had a NameError" % sys._getframe().f_code.co_name
except:
print "%s had a different Error" % sys._getframe().f_code.co_name
这将防止代码重复并解决try:except:issue上面的答案不适用于带有参数的函数-对于后一种情况,我认为您需要类似以下内容:
def handleError(f):
def handleProblems(*args, **kwargs):
try:
return f(*args, **kwargs)
except Exception:
print "Oh noes"
return handleProblems
我们可以这样测试:
@handleError
def addTwo(x, y):
print(x + y)
>>> addTwo(5,5)
10
>>> addTwo(5, 's')
Oh noes
我最近遇到了同样的情况,在我的例子中,我有一些自定义异常,我需要根据这些异常记录或进一步引发异常。我创建了一个decorator方法来按类型处理异常
try:
obj.some_method()
except Exception as e:
catch_and_log_exception(e)
def catch_and_log_exception(e):
if isinstance(e, MyConnectionError):
print "Connection error : %s." % e.message
sys.exit(1)
elif isinstance(e, MyConnectionTimeout):
print "Connection to server has been timed out. %s" % e.message
sys.exit(1)
elif isinstance(e, MyException):
message = e.explanation if e.explanation else e.message
log_error_message(str(message))
print "Failed, please check the logs."
sys.exit(1)
else:
raise e
希望这有帮助 捕捉任何异常通常都是一个非常糟糕的主意。它掩盖了真正的问题,使调试更加困难。捕捉任何你知道的异常——如果你不知道它们,你真的想捕捉它们吗?这是一个很好的观点。如果函数失败,我确实需要脚本继续。最后一个“except”包括打印sys.exc_info()[:2],其中包括异常的名称。有更好的方法吗?这不是一个好例子,因为decorator不适用于带参数的函数。