python 错误处理的问题

2016-04-13 18:14:45 +08:00
 tetsuo
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()

最后一个 raise 有什么用?
2910 次点击
所在节点    Python
6 条回复
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
pimin
2016-04-13 21:41:29 +08:00
我也是看廖的教程
如果这里不继续抛出确实会有问题。
至少是在调试的时候你可能很难定位到确切的错误地点。
举个例子:
try:
........with open('log.txt','r') as f:
.............print(f.read())
except:
....print('file error!')

这样如果你文件编码有问题,打开文件是没有问题的
错误会出现在 print 语句上。
当然你可以写代码的时候多个 except 逐个去排查问题,但是我觉得没什么意义。
syv2
2016-04-13 22:48:08 +08:00
oroge 已经解释了原因了,我在补充一句,个人认为用「 raise error 」来显性地抛出异常,要比单独用「 raise 」在可读性上要好一些。
xi2008wang
2016-04-14 01:01:18 +08:00
Python Cookbook
14.10 重新抛出被捕获的异常
通常是当你需要在捕获异常后执行某个操作(比如记录日志、清理等),
但是之后想将异常传播下去
kinghui
2016-04-14 10:09:00 +08:00
@syv2 两个代表不同的意思, raise error 是重新抛出该异常, raise 是传递该异常. Traceback 的表现会有不同, 单独使用 raise 能更精准的从 Traceback 中定位抛出异常的位置.
syv2
2016-04-14 14:36:50 +08:00
@kinghui 你说的对。可能和我的应用需求有关,我一般不用来跟踪异常,而是把异常当作返回,在 except 里对异常做一次封装,由整个系统最外部的异常 handle 作统一处理。如果是调试阶段,确实直接 raise 更容易跟踪问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/270803

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX