例如,以下是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
答案 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
由于UnicodeDecodeError
是ValueError
的子类,因此第二个异常处理程序会导致忽略任何UnicodeDecodeError
。看起来这不是预期的效果,为避免它,UnicodeDecodeError
由第一个处理程序显式处理。因此,如果两个处理程序不在一起ValueError
,则只会忽略UnicodeDecodeError
。
答案 1 :(得分:3)
没有,我能想到,除非您正在调试该源代码并在raise
语句上设置断点。
答案 2 :(得分:2)
严格来说,这是不必要的。
一些可能性:
答案 3 :(得分:1)
最常见的用途是传播某个特定异常并处理所有其他异常。您可以找到许多用于传播KeyboardInterrupt
和SystemExit
的示例(例如,查看asyncore
源代码):如果请求处理程序出错,服务器可以方便地记录并继续,但是不应该抓住KeyboardInterrupt
退出SIGINT
。