1
oroge 2016-04-13 18:20:27 +08:00
=====引用开始=====
最后,我们来看另一种错误处理的方式: # err_reraise.py def foo(s): n = int(s) if n==0: raise ValueError('invalid value: %s' % s) return 10 / n def bar(): try: foo('0') except ValueError as e: print('ValueError!') raise bar() 在 bar()函数中,我们明明已经捕获了错误,但是,打印一个 ValueError!后,又把错误通过 raise 语句抛出去了,这不有病么? 其实这种错误处理方式不但没病,而且相当常见。捕获错误目的只是记录一下,便于后续追踪。但是,由于当前函数不知道应该怎么处理该错误,所以,最恰当的方式是继续往上抛,让顶层调用者去处理。 =====引用完毕===== 引用来源: http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143191375461417a222c54b7e4d65b258f491c093a515000 |
2
pimin 2016-04-13 21:41:29 +08:00 via Android
我也是看廖的教程
如果这里不继续抛出确实会有问题。 至少是在调试的时候你可能很难定位到确切的错误地点。 举个例子: try: ........with open('log.txt','r') as f: .............print(f.read()) except: ....print('file error!') 这样如果你文件编码有问题,打开文件是没有问题的 错误会出现在 print 语句上。 当然你可以写代码的时候多个 except 逐个去排查问题,但是我觉得没什么意义。 |
3
syv2 2016-04-13 22:48:08 +08:00
oroge 已经解释了原因了,我在补充一句,个人认为用「 raise error 」来显性地抛出异常,要比单独用「 raise 」在可读性上要好一些。
|
4
xi2008wang 2016-04-14 01:01:18 +08:00
Python Cookbook
14.10 重新抛出被捕获的异常 通常是当你需要在捕获异常后执行某个操作(比如记录日志、清理等), 但是之后想将异常传播下去 |