###python异常###
1 .异常类型
BaseException的所有异常基类
系统退出解释器请求退出
Exception常见错误的基类
评估错误断言语句失败
属性错误对象不具有此属性
IOError的输入输出操作失败
操作系统错误
WindowsError系统调用失败
ImportError导入模块失败
SyntaxError Python语法错误
2 .异常概念:
如果python解释器在程序运行时遇到错误,程序将停止运行
提示错误的信息是异常的
在我们开发程序的时候,很难用跨度处理所有特殊的东西,因为异常的捕获
通过集中处理突发事件,保证程序的健壮性和稳定性
在程序开发中,不能确定对某个代码的执行时(在程序语法完全正确的前提下) ) ) )。
可以增加try来捕捉异常
try:
要执行的代码
except :
发生错误的处理
''''
try:
#无法确定正确执行的代码
num=int(raw_input (请输入整数) )
except:
print ‘请输入正确的整数! 「
print ‘*‘ * 50
''''
如果这个try,except的语句被评论的话,
代码语法没有问题,但如果编译时发生了错误
错误代码后的语句将不再执行
此语句用于报告错误,但不影响以下代码的执行
''''
3 .捕捉异常的机制
try的工作原理:
执行try语句时,python解释器将标记当前程序流的上下文。 出现异常时,程序流可以根据上下文中的标记返回标记位,从而避免程序退出。
1 .如果在执行try语句时出现异常,程序流将返回标志位,并向下匹配执行与该异常匹配的第一个except语句。 异常处理完成后,程序流将通过整个try语句(异常处理过程中出现新异常时除外)。
2 .如果找不到与异常匹配的except语句(可以使用不指定异常类型或相同异常类型Excrption来捕获异常),则将异常传递到更高的try (如果存在try嵌套),还会找到匹配的except语句如果找不到,请退出程序并打印默认错误消息。)。
3 .如果在执行try语句时没有出现异常,python将执行else语句之后的语句,控制流通过整个try语句
4 .异常预判
根据错误类型捕获异常:
try:
要执行的代码
except错误类型1 :
对错误类型1,进行对应的代码处理
except错误类型2 :
对于错误类型2,进行对应的代码处理
需求:
提示用户输入整数
输出8除以用户输入的整数
代码:
try:
#提示用户输入数量。 如果此代码没有问题,请单击,
#可能是因为用户输入
#因为发生了错误,所以有必要利用异常捕获
num=int(raw_input )“请输入数字:‘)
res=8/num
打印RES
#以下两个预测是知道程序报告错误的操作
except ValueError:
print ‘输入的不是数! 「
except ZeroDivisionError:
print ‘0不能除数! 「
#但是,错误的情况很多,有时无法判断
#这样会发生代码错误
#这种情况我们不想看到
except Exception as result:
print ‘未知错误! %s‘%result
#以下代码是无论有没有异常都要执行的代码
finally:
print ‘无论有无异常都要执行的代码’
#因为使用了异常捕获,所以不影响后面代码的执行
print ‘*‘ * 30
''''
finally的作用(这个语句,能用于什么? )
如果没有垃圾回收机制和结构函数自动调用机制(以析构函数:为对象)
不再使用时自动调用的函数)的语言来说,finally语句非常重要
是的。 这样,程序员就可以确保:无论try块发生了什么,内存总是被释放。 fi
nally可以except同时使用。注意:
编译器不允许把范围大的异常对象放在前面,假如捕获到了Exception
异常对象,那么就将会停止捕获,而作为其子类的额处理程序就将永远得不到
执行
"""
5.异常的传递
def demo1():
return int(raw_input(‘请输入整数:‘))
def demo2():
return demo1()
# 函数的错误:一级一级的去找,最终会将异常传递到主程序里面
# print demo2()
"""
所以当代码量很多的时候,不需要每一个函数都加异常的捕获
可以直接在最终的主程序加一个捕获
"""
try:
print demo2()
except Exception as result:
print ‘未知错误 %s‘ % result
print ‘*‘ * 50
6.主动抛出异常 触发异常 raise
raise关键字:手动抛出一个通用的异常类型(Exception),raise关键字后面跟异常的名称,异常名称能够标识出异常类的对象.执行raise语句时,python会创建指定异常类的对象
需求:
提示用户输入密码,如果长度小于8,就抛出异常
def input_passwd():
#提示用户输入密码
pwd = raw_input(‘请输入密码‘)
#判断密码的长度是否大于8,大于就返回用户密码
if len(pwd) >= 8:
return pwd
#如果小于8,就主动抛出异常
print ‘主动抛出异常‘
# #创建异常对象
ex = Exception(‘密码长度不够‘)
# #主动抛出异常
raise ex
#注意:只抛出异常而不捕获异常,代码会出错
try:
print input_passwd()
except Exception as result:
print result
7.断言
可以理解为提前预言,让人更好的知道错误的原因
def fun(num, div):
assert (div != 0), ‘div不能为0‘
##如果不添加指定的提示信息 ‘div不能为0‘ 的话,编译会提示 AssertionError 断言语句失败并且不提示失败的原因;添加就相当于提示错误在哪里
return num / div
print fun(10,0)
"""
assert语句触发异常:
assert语句根据后面的表达式的真假来控制程序流
若为True,则往下执行;若为False,则中断程序并调用默认的异常处理
同时输出指定的提示信息
"""
8.捕捉多个异常
(1)方法一:
指定一个通用异常,可以捕获多个不同的包含在Exception类中的异常类
try:
语句块
except Exception:
语句块
(2)方法二:
在一个except句子将多个异常作为元组元素列出
try:
语句块
except (IOError,ValueError):
语句块
(3)方法三:
except句子后不带任何异常异常名称,捕获所有异常
9.自定义异常
通过(直接或者间接)继承Exception类来创建一个自定义异常类,自定义的异常类只能通过raise关键字来手动触发
示例:
#直接继承Exception类
class testError(Exception):
def __init__(self,arg):
self.arg = arg
try:
raise testError(‘just test‘)
except testErro,info:
print info.args