只有加注的例外是否有用?

时间:2009-11-21 07:08:53

标签: python exception-handling

例如,以下是django.templates.loader.app_directories.py中的一些代码。[1]

try:
    yield safe_join(template_dir, template_name)
except UnicodeDecodeError:
    # The template dir name was a bytestring that wasn't valid UTF-8.
    raise

如果你抓住一个例外只是为了重新提起它,它的目的是什么?

[1] http://code.djangoproject.com/browser/django/trunk/django/template/loaders/app_directories.py

4 个答案:

答案 0 :(得分:17)

在您链接的代码中是另一个额外的异常处理程序:

try:
    yield safe_join(template_dir, template_name)
except UnicodeDecodeError:
    # The template dir name was a bytestring that wasn't valid UTF-8.
    raise
except ValueError:
    # The joined path was located outside of template_dir.
    pass

由于UnicodeDecodeErrorValueError的子类,因此第二个异常处理程序会导致忽略任何UnicodeDecodeError。看起来这不是预期的效果,为避免它,UnicodeDecodeError由第一个处理程序显式处理。因此,如果两个处理程序不在一起ValueError,则只会忽略UnicodeDecodeError

答案 1 :(得分:3)

没有,我能想到,除非您正在调试该源代码并在raise语句上设置断点。

答案 2 :(得分:2)

严格来说,这是不必要的。

一些可能性:

  1. 出于文档目的 - 只是为了明确哪些例外是预期的
  2. 在重新筹集之前作为未来(或过去)更严肃处理的占位符

答案 3 :(得分:1)

最常见的用途是传播某个特定异常并处理所有其他异常。您可以找到许多用于传播KeyboardInterruptSystemExit的示例(例如,查看asyncore源代码):如果请求处理程序出错,服务器可以方便地记录并继续,但是不应该抓住KeyboardInterrupt退出SIGINT