异常定义:python运行时出现的错误
一般有两种形式:
语法错误:软件结构上有错误而导致不能被解释器解释或不能被编译器编译
逻辑错误:由于不完整或不合法的输入所致,也可能是逻辑无法生成,计算或者输出结果需要的过程无法执行等
python异常是一个对象,表示错误或意外情况
由python检测到一个错误时,将触发一个异常
python可以通过异常传导机制传递一个异常对象,发出一个异常情况出现的信号
程序员也可以在代码中手动触发异常
python异常也可以理解为:程序出现错误而在正常控制流以外采取的行为
第一阶段:解释器触发异常,此时当前程序流将被打断
第二阶段:异常处理,如忽略非致命性错误,减轻错误带来的影响等
-----异常的功用--------------------------------------------------------
python的默认处理:停止程序,打印错误消息
使用try语句处理异常并从异常中恢复
事件通知:
用于发出有效状态信号
特殊情况处理:
无法调整代码去处理的场景
终止行为:
try/finally语句可确保执行必须的结束处理机制
非常规控制流:
异常是一种高级跳转机制
------检测和处理异常-------------------------------------------------
异常通过try语句来检测:
任何在try语句块里的代码都会被监测,以检查有无异常发生
try语句只要有两种形式:
try-except:检测和处理异常
可以有多个except
支持使用else子句处理没有探测异常的执行的代码
try-finally:
仅检测异常并做出去一些必要的清理工作
仅能有一个finally
try语句的复合形式:
try-except-finally
try-except语句
定义了进行异常监控的一段代码,并且提供了处理异常的机制
语法:
try:
try_suite
except Exception[,reason]:
except_suite
例子:
>>>try:
f1 = open("/tmp/a.txt","r") 前提:/tmp/a.txt没有这个文件
except IOrror,e:
print 'Could not open file:',e
could not open file:[Errno 2] No such file or directory:‘/tmp/a.txt’
try-except-else语句
try语句可以带多个except子句,还可以有一个可选的else子句,语法格式如下
try:
try_suite
except EXception1[,reason]:
suite_exception1
except(exception2,exception3,....)[,reason]: 一次捕获多个异常时要定义为元组
suite
except: 空except语句用于捕获一切异常
suite_
else:
else_suite
except分句个数没有限制,但else只能有一个
没有异常发生时,else分句才会执行
没有符合except分句时,异常会向上传递到程序中的之前进入的try中或者到进程的顶层
try-finally语句
无论异常是否发生,finally子句都会执行
常用于定义必需进行清理的动作,如关闭或断开服务器连接等
finally中的所有代码执行完毕后会继续向上一层引发异常
语法:
try:
try_suite
finally:
finally_suite
例如:
>>> try:
f1 = open("/tmp/a.txt",'r')
f1.write("hello world")
finally:
f1.close()
Traceback (most recent call last):
file "<stdin>",line 3, in <module>
IOError:file not open for writing
总结:try语句的分句形式
分句形式 说明
except: 捕捉所有异常类型
except name: 只捕捉特定的异常
except name, value: 捕捉所列的异常和其它额外的数据(或实例)
except (name1, name2): 捕捉任何列出的异常
except (name1, name2), value: 捕捉任何列出的异常,并取得额外数据
else: 如果没有引发异常,就运行
finally 总是会运行此代码块
try-except-else-finally语句
语法:
try:
try_suite
except Exception1: 错误1怎么做
suite1_exceptinon1
except (Exception2,Exception3): 错误23怎么做
suite23_exception23
....
else: 其它错误怎么做
else_suite
finally: 总是执行
finally_suite
可以替换为在try-finally语句中嵌套try-except语句的形式
try:
try:
try_suite
except ....
except ....
finally:
finally_suite
自定义异常
raise语句可显示触发异常
raise [SomeException [,args[,traceback]]]
someException:可选字段
args:可选,以元组的形式传递给异常的参数
traceback:可选,异常触发时新生成的一个用于异常-正常化的跟踪记录,多用于重新引发异常时
例如:
>>>def CrossProduct(seq1,seq2):
if not seq1 or seq2:
raise ValueError,"Sequence argements must be non-empty"
return [(x1,x2) for x1 in seq1 for x2 in seq2]
>>>seq1=[]
>>>seq2=[]
>>>CrossProduct(seq1,seq2)
Traceback (most recent call last):
File "<pyshell#25>",line 1, in <module>
CrossProduct(sqe1,sqe2)
File "<pyshell#22>",line 3,in CrossProduct
raise ValueError,"Sequence argements must be non-empty"
ValueError: Sequence argements must be non-empty
例如:我们自定义一个异常,判断aa和bb,如果aa和bb不是列表的话就抛出异常AttributeError(属性错误)
>>> def func(a,b):
.>>> if type(a)!="list" or type(b)!="list":
.>>> raise AttributeError,"a and b must be list"
>>> aa = (1,2)
>>> bb = (3,4)
>>>func(aa,bb)
报错:
AttributeError Traceback (most recent call last)
<ipython-input-5-2914e0c3d296> in <module>()
----> 1 func(aa,bb)
<ipython-input-1-718d31a6dce6> in func(a, b)
1 def func(a,b):
2 if type(a)!="list" or type(b)!="list":
----> 3 raise AttributeError,"a and b must be list"
4
5
------------------异常对象-------------------------------
Python异常是内置的经典类Exception的子类的实例
为了向后兼容,python还允许使用字符串或任何经典类实例
python2.5之后,Exception是从BaseException继承的新式类
python自身引发的所有异常都是Exception的子类的实例
大多的标准异常都是由StandardError派生的,其中有3各抽象的子类
ArithmeticError
由于算术错误而引发的异常基类
OverflowError,ZeroDivisionError,FloatingPointError
LookupError
容器在接受到一个无效键或索引时引发的异常的基类
IndexError,KeyError
EnvironmentError
由于外部原因而导致的异常的基类
IOError,OSError,WindowsError
--------------标准异常类----------------------------------
AttributeError:属性错误
IOError:I/O操作失败
ImportError:import找不到导入的模块
IdentationError:缩进错误
IndexError:用来索引序列的整数超出范围
NameError:引用了一个不存在的变量名
........等
--------自定义异常类-----
自定义异常类和多重继承
较有效的方法是从自定义异常类和标准异常类进行多重继承,例如:
Class CustomAttributeError(CustomException,AttributeError):
pass
标准库中使用的其它异常
python标准库中的许多模块都定义了自己的异常类,
如socket中的socket.Error
总结:
python异常对象
通过类BaseException生成
raise触发异常
assert 断言
try:
except
except BaseException
else
try-finally
try-except-else-finally
try:
try-except-else
finally:
转载于:https://www.cnblogs.com/RomanticYori/p/6044918.html