我在其他地方看到过使用以下内容来重新引发异常。
try:
whatever()
except:
raise
重新抛出异常有什么用呢?难道未捕获的异常不会一直向上抛出吗?例如:
try:
int("bad")
except:
raise
具有相同的输出:
int("bad")
即,我在控制台中收到了ValueError错误。
您的示例代码没有意义,但如果您想执行仅在失败时发生的日志记录或清理操作,可以将其放置在except:
和raise
之间,然后进行该工作,然后继续像原始异常正常冒泡一样进行。
except: raise
(没有其他代码)是毫无意义的。但我确实经常遇到它,它会掩盖真正的故障点。似乎这是 Python 异常哲学的一种影响。 - semiomantraise
,它不会掩盖真正的失败点(原始异常,包括回溯,将继续向上冒泡,就像从未被拦截一样)。但是,在Python 2上,如果他们引发了一个不同的异常而没有明确采取措施保留有关原始异常的信息,则原始原因将丢失(Python 3在except
或finally
块中引发新异常时链接异常上下文,因此信息并非完全丢失)。 - ShadowRanger想象以下代码。
先来做一些铺垫:您负责维护一个大型信息数据库,任何数据丢失都将是灾难性的!
huge_dictionary = {'lots_of_important':['stuffs']}
try:
check_data(new_data) #make sure the data is in the correct format
huge_dictionary['lots_of_important'].append(new_data)
except:
data_writer.backup(huge_dictionary)
data_writer.close()
#and any other last second changes
raise