在没有其他代码的情况下重新引发异常是否有任何价值?
try:
#code
except Exception:
raise
我最近正在查看一些代码并看到几个这样的块,在except块中没有任何额外的东西,但另一个加注。我认为这是一个错误和糟糕的决策,我是对的吗?
答案 0 :(得分:2)
我无法想出一些有用的东西,除了将它保留为占位符以便以后插入以捕获有用的异常。
当你想稍后包含“try .. except ..”块时,它可以避免重新缩进代码。
答案 1 :(得分:2)
我之前在(一组)可怕的VB.NET项目中看到过类似的代码。意图是捕获和记录异常,而不是回过头来完成日志记录,或者他们听到“你必须捕获异常”,实现了这个功能,而其他人决定它应该重新加注。
上述代码没有任何好处。
答案 2 :(得分:2)
基于this question构建的示例。如果except
块中还有其他try
个,则可以用它来过滤异常,但仅此一点就没有意义。
class FruitException(Exception): pass
try:
raise FruitException
except FruitException:
print "we got a bad fruit"
raise
except Exception:
print "not fruit related, irrelevant."
答案 3 :(得分:1)
是的,这通常是一种不好的做法。我见过这种模式的唯一(有些)正确的用法是在VB.NET有一个Using
构造之前。用法看起来像:
Dim myResource As DisposableService
Try
myResource = New DisposableService()
' This might throw an exception....
myResource.DoSomething()
Catch
Throw
Finally
' Perform cleanup on resource
If Not myResource Is Nothing Then
myResource.Dispose()
End If
End Try
除此之外,我真的想不出这种事情的好用例。
答案 4 :(得分:1)
有时它很有用,让我给你一个真实的例子,我做了我的工作:
这是在一个包装func的装饰器中:所以基本上我想要的是重新提高我在调用函数func时捕获的错误,以便装饰器不会改变函数func的行为,因为当func引发异常时,异常会发送到GUI,以便弹出错误消息给用户,
并且尝试除了我使用它因为我想在最后执行代码,即使引发了异常
try:
result = func(self, *args, **kws)
return result
except Exception, ex:
# If an exception is raised save it also.
logging_data['message'] = str(ex)
logging_data['type'] = 'exception'
# Raise the error catched here so that we could have
# the same behavior as the decorated method.
raise
finally:
# Save logging data in the database
....
希望这有助于理解重新加注的使用
答案 5 :(得分:0)
通常在try-catch模型中,会自动抛出任何未捕获的异常(引发?)。捕捉异常只是为了重新抛出它可能是精神Allman风格编码,但没有任何功能目的。
答案 6 :(得分:0)
def something(a,b):
try:
// do stuff
except SomethingSpecificToThisFunction:
//handle
except: //Everything else, should likely be handled somewhere else
raise
try:
something("a","b")
except e:
Log(e)
然后再次出现它的默认行为,所以可能只是想把它留下来
答案 7 :(得分:0)
在多线程环境中有一些使用此类技术的方法。例如,将某些东西扔到上层堆栈。