【问题标题】:except block does not catch the exception in python除了块不会捕获python中的异常
【发布时间】:2011-10-20 08:06:45
【问题描述】:

我的代码如下

class Something(models.Model)

    def exception(self)
    try:
       Something.objects.all()
    except Exception():
       raise Exception()

从测试用例中调用此方法,它可以工作,但我需要引发异常,它不会捕获异常 这是我的测试用例

def test_exception(self):
    instance = Something()
    instance.exception()

它工作正常,但我需要从除块中引发异常

【问题讨论】:

  • 目前还不清楚您要做什么。为什么要从 catch 块中引发异常?此外,您的示例中有许多语法错误(例如,缺少:exception 上的错误缩进)。
  • 如果您使用 python unittest 框架,您可能想使用 assertRaises(exception) 方法。

标签: python exception try-catch


【解决方案1】:

这一行:

except Exception():

应该是:

except Exception:

【讨论】:

  • 是的,但当然不应该这样,因为只捕获 Exception 是一个非常糟糕的主意 - 您应该捕获您处理的实际异常,并让其他异常冒泡。
  • 我可以知道被否决的原因吗?我的回复在技术上是正确的,并且完全回答了 OP 问题,所以我认为没有正当理由投反对票,请参阅 StackOverflow 的常见问题解答。如果您想就良好的 Python 编程实践向 OP 提供建议,请评论该问题。
  • @nicola 你是对的。确实,我赞成它。它比其他答案更好地回答了这个问题,后者指出了正确的用法,但没有指出原始示例失败的原因。我怀疑它也应该是raise Exception(不带括号)或raise。好的做法与坏的做法不是问题的一部分。
【解决方案2】:
def exception(self)
    try:
        Something.objects.all()
    except Exception, err:
        #print err.message (if you want)
        raise err

这将捕获错误并在需要时打印确切的消息。

【讨论】:

  • 我相信你的意思是raise err。你不能提出 err.message 这是一个字符串。
【解决方案3】:

为什么捕获异常只是为了重新引发它? 如果除了重新引发异常之外,您在 except 套件中没有做任何事情,那么一开始就不要捕获异常:

@staticmethod
def exception():
    Something.objects.all()

如果您在 except 套件中做一些重要的事情,那么:

def exception(self):
    try:
        Something.objects.all()
    except Exception:
        # do something (with self?)
        raise 

然后,测试exception 方法是否引发异常:

def test_exception(self):
    instance = Something()
    self.assertRaises(Exception, instance.exception)

这取决于Something.objects.all() 提高Exception


PS。如果exception 不依赖于self,那么最好将其从参数列表中删除,并使exception 成为静态方法。

PPS。 Exception 是一个非常广泛的基础异常类。更具体的异常对调试更有帮助,并允许其他代码捕获此特定异常,而不是强制它处理任何可能的Exception

【讨论】:

    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 2014-11-06
    • 2012-06-04
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多