捕获异常并立即再次提升它的任何价值?

时间:2010-10-14 21:08:41

标签: python exception-handling

  

可能重复:
  Does a exception with just a raise have any use?

在没有其他代码的情况下重新引发异常是否有任何价值?

try:
  #code
except Exception:
  raise

我最近正在查看一些代码并看到几个这样的块,在except块中没有任何额外的东西,但另一个加注。我认为这是一个错误和糟糕的决策,我是对的吗?

8 个答案:

答案 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)

在多线程环境中有一些使用此类技术的方法。例如,将某些东西扔到上层堆栈。