http://blog.csdn.net/pipisorry/article/details/21841883
最重要的问题是你在开发过程中隐藏了bug,如果当时你没加这个Try…Catch,恐怕你早就发现这个bug了,因为程序压根就跑不下去。
[try catch 对代码运行的性能影响]
[你写的Try...Catch真的有必要么?]
(含py2和py3的区别)
Python 3
try:
except Exception as e:
print(e)
不过lz推荐下面的格式:
import traceback
try: ... except: print(traceback.format_exc()) input("hold on...")
直接调用print Exception, e得到的结果就只有一行信息,只是异常的名字和说明而已。而这样可以输出栈信息,ide中点击就可以到达错误位置,并且不会一闪而过。
异常
1)所以异常都从 BaseException继承,并删除了StardardError 。StandardError
异常:在Python 2里,StandardError
是除了StopIteration
,GeneratorExit
,KeyboardInterrupt
,SystemExit
之外所有其他内置异常的基类。在Python 3里,StandardError
已经被取消了;使用Exception
替代。
Notes | Python 2 | Python 3 |
---|---|---|
x =StandardError() |
x =Exception() |
|
x =StandardError(a, b, c) |
x =Exception(a, b, c) |
2)去除了异常类的序列行为和.message属性
3)异常链,因为__context__在3.0a1版本中没有实现
as
。as
也可以用在一次捕获多种类型异常的情况下。在导入模块(或者其他大多数情况)的时候,你绝对不应该使用这种方法(指以上的fallback)。不然的话,程序可能会捕获到像KeyboardInterrupt
(如果用户按Ctrl-C来中断程序)这样的异常,从而使调试变得更加困难。
触发异常-raise
语句
Python 3里,抛出自定义异常的语法有细微的变化。
Notes | Python 2 | Python 3 |
---|---|---|
① | raise MyException |
unchanged |
② | raise MyException,'error message' |
raise MyException('error message') |
③ | raise MyException,'error message', a_traceback |
raise MyException('error message').with_traceback(a_traceback) |
④ | raise 'error message' |
unsupported |
Note:
2to3
将会警告你它不能自动修复这种语法。生成器的throw
方法
在Python 2里,生成器有一个throw()
方法。调用a_generator.throw()
会在生成器被暂停的时候抛出一个异常,然后返回由生成器函数获取的下一个值。在Python 3里,这种功能仍然可用,但是语法上有一点不同。
Notes | Python 2 | Python 3 |
---|---|---|
① | a_generator.throw(MyException) |
no change |
② | a_generator.throw(MyException,'error message') |
a_generator.throw(MyException('error message')) |
③ | a_generator.throw('error message') |
unsupported |
2to3
会显示一个警告信息,告诉你需要手动地来修复这处代码。Python 3中的异常处理也发生了一点变化。在Python 3中必须使用“as”关键字。
Python 2
try:
let_us_cause_a_NameError
except NameError, err:
print err, '--> our error message'
name 'let_us_cause_a_NameError' is not defined --> our error message
Python 3
try:
let_us_cause_a_NameError
except NameError as err:
print(err, '--> our error message')
name 'let_us_cause_a_NameError' is not defined --> our error message
except的一个例子:
考虑下面这个文件
import sys def bar(i):
if i == 1:
raise KeyError(1) def bad():
e = None
try:
bar(int(sys.argv[1]))
except KeyError as e:
print('key error')
print(e)
bad()
在python2中一切运作正常
$ python foo.py 1
key error
1
但是在python3中事情变得一团糟
$ python3 foo.py 1
key error
Traceback (most recent call last):
File "foo.py", line 19, in <module>
bad()
File "foo.py", line 17, in bad
print(e)
UnboundLocalError: local variable 'e' referenced before assignment
Note:问题出在,在Python3中,异常对象无法在异常块作用域外访问。(原因是在垃圾收集器运行且从内存中清理引用之前会在内存栈帧中保存一个引用周期)
解决此问题的方法之一是在异常块作用域外围护一个异常对象的引用,以使其可访问。这里是前例使用这一技术的一个版本,使得代码对Python2和Python3都友好:
import sys
def bar(i):
if i == 1:
raise KeyError(1) def good():
exception = None
try:
bar(int(sys.argv[1]))
except KeyError as e:
exception = e
print('key error')
print(exception)
除0异常ZeroDivisionError
现在除以变量A=0都不会被try-except捕捉到了,会直接在运行时警告:
RuntimeWarning: divide by zero encountered in double_scalars
只有直接除以0才会被try-except捕捉到
其它异常
x,y为字典,如果x < y的不能比较,抛出TypeError异常。2.x版本是返回伪随机布尔值的。
sys.exc_type, sys.exc_value, sys.exc_traceback
处理异常的时候,在sys模块里有三个你可以访问的变量:sys.exc_type,sys.exc_value,sys.exc_traceback。(实际上这些在Python 1的时代就有。)从Python 1.5开始,由于新出的sys.exc_info,不再推荐使用这三个变量了,这是一个包含所有以上三个元素的元组。在Python 3里,这三个变量终于不再存在了;这意味着,你必须使用sys.exc_info。
Notes | Python 2 | Python 3 |
---|---|---|
sys.exc_type | sys.exc_info()[0] | |
sys.exc_value | sys.exc_info()[1] | |
sys.exc_traceback | sys.exc_info()[2] |
如打印日志所示,在转换成功未发生错的的时候,else语句里的逻辑会被执行,当然这个例子可能并没有什么太多的实际的用处,但大致能说明else在错误处理中的用处:简化逻辑,避免使用一些标志值就能够准确把握是否发生错误的情况来做一些实际的操作(比如在保存数据的时候如果发生错误,在else语句块中进行rollback的操作,然后紧接着还能加上finally语句完成一些清理操作。
皮皮blog
常见的python异常类型
from:http://blog.csdn.net/pipisorry/article/details/21841883