为什么,既然 try except 已经是抓到问题了,为什么还要 raise,把它丢出去呢?
在 python 里,对于有可能错误的地方,就是用 try 去包住它,然后针对可能的错误去处理它。像是:
try:
f = open('x','r')
except IOError:
raise
except Exception:
print 'other error'
raise
有天某个人问我,为什么,既然已经是抓到问题了,为什么还要 raise,把它丢出去呢?也许有很多理由,但我有两个简单的理由:(1)我想直接让程序被停掉,(2)我想让执行我写的程序的程序也知道有问题,让它自己决定该怎么办。这在写程序给别的程序用的时候很重要。
在 raise exception 的时候,我以前是写成以下这样:
try:
f = open('x','r')
except Exception, ex:
print 'other error'
raise ex
这样在文句上好像很正常,但是就会出现困扰的地方,就是 traceback 所指的 exception 行号是在 raise 的地上,而不是真正发生的地方。
IOError Traceback (most recent call last)
in ()
3 except Exception, ex:
4 print 'other error'
----> 5 raise ex
IOError: [Errno 2] No such file or directory: 'x'
后来才发现,应该直接 raise 后面不加参数,才会如下指到对的行数去。
IOError Traceback (most recent call last)
in ()
1 try:
----> 2 f = open('x','r')
3 except IOError:
4 raise
5 except Exception:
IOError: [Errno 2] No such file or directory: 'x'
分享