目录
当程序运行出现异常时,若程序中没有设置异常处理功能,解释器会采用系统默认的方式处理异常,即返回异常信息终止程序。异常信息通常包含异常代码所在的行号、异常的类型和异常的描述信息。
一、Exception类内置异常
BaseException 所有异常的基类 SystemExit 解释器请求退出 KeyboardInterrupt 用户中断执行(通常是输入^C) GeneratorExit 生成器(generator)发生异常来通知退出 Exception 常规错误的基类 StopIteration 迭代器没有更多值 StopAsyncIteration 必须通过异步迭代器对象的__anext__()方法引发以停止迭代 ArithmeticError 所有数值计算错误的基类 FloatingPointError 浮点计算错误 OverflowError 数值运算超出最大限制 ZeroDivisionError 除(或取模)零 (所有数据类型 AssertionError 断言语句失败 AttributeError 对象没有这个属性 BufferError 与缓冲区相关的操作时引发 EOFError 没有内建输入,到达EOF 标记 ImportError 导入失败 ModuleNotFoundError 找不到模块 LookupError 无效数据查询的基类 IndexError 序列中没有此索引(index) KeyError 映射中没有这个键 MemoryError 内存溢出错误 NameError 未声明、初始化对象 UnboundLocalError 访问未初始化的本地变量 OSError 操作系统错误, BlockingIOError 操作将阻塞对象设置为非阻塞操作 ChildProcessError 子进程上的操作失败 ConnectionError 与连接相关的异常的基类 BrokenPipeError 在已关闭写入的套接字上写入 ConnectionAbortedError 连接尝试被对等方中止 ConnectionRefusedError 连接尝试被对等方拒绝 ConnectionResetError 连接由对等方重置 FileExistsError 创建已存在的文件或目录 FileNotFoundError 请求不存在的文件或目录 InterruptedError 系统调用被输入信号中断 IsADirectoryError 在目录上请求文件操作 NotADirectoryError 在不是目录的事物上请求目录操作 PermissionError 在没有访问权限的情况下运行操作 ProcessLookupError 进程不存在 TimeoutError 系统函数在系统级别超时 ReferenceError 弱引用试图访问已经垃圾回收了的对象 RuntimeError 一般的运行时错误 NotImplementedError 尚未实现的方法 RecursionError 解释器检测到超出最大递归深度 SyntaxError Python 语法错误 IndentationError 缩进错误 TabError Tab 和空格混用 SystemError 一般的解释器系统错误 TypeError 对类型无效的操作 ValueError 传入无效的参数 UnicodeError Unicode 相关的错误 UnicodeDecodeError Unicode 解码时的错误 UnicodeEncodeError Unicode 编码时错误 UnicodeTranslateError Unicode 转换时错误 Warning 警告的基类 DeprecationWarning 关于被弃用的特征的警告 PendingDeprecationWarning 关于构造将来语义会有改变的警告 RuntimeWarning 可疑的运行行为的警告 SyntaxWarning 可疑的语法的警告 UserWarning 用户代码生成的警告 FutureWarning 有关已弃用功能的警告的基类 ImportWarning 模块导入时可能出错的警告的基类 UnicodeWarning 与Unicode相关的警告的基类 BytesWarning bytes和bytearray相关的警告的基类 ResourceWarning 与资源使用相关的警告的基类
二、异常捕获语句
python可以通过try-except语句中实现简单的异常捕捉与处理过程,也可以将try-except语句与else或finally字句进行结合。
2.1使用try-except语句捕捉异常
语法格式:
try:
可能出错的代码
except[异常类型[as erroe]];
捕获异常后的处理代码
以上格式中try子句之后为可能存在出错的代码,也就是需要被监控的代码:在except子句中可以指定异常类型,若指定了异常类型,该子句只对异常类型相互匹配的异常进行处理,否则处理try语句中捕获的所有异常;except子句中的as关键字用于将捕获到的异常对象赋给error;except子句红的代码时处理异常时执行的代码。
try-except语句的执行过程为:优先执行try子句中可能出错的代码。若try子句中没有出现异常,忽略except子句继续向下执行;若try子句中出现异常,忽略try子句的剩余代码,转而执行except子句;若程序出现的异常类型与except子句中指定的异常类型匹配,使用error记录异常消息,执行except子句中的代码,否则按照系统默认终止程序。
1、捕获单个异常
捕获单个异常通常时指在except之后指定捕获的单个异常类型即可
如以下代码:
num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
try:
print("结果为:",num_one/num_two)
except ZeroDivisionError:
print("输入错误")
运行结果:
以上代码表示当try子句中捕获到第2个整数相除可能出现异常,由于变量num_two具有不确定性,可能导致程序引发ZeroDivisionError异常;except子句中且明显的捕获到ZeroDivisionError异常数据,故程序只有在捕获到ZeroDivisionError异常后才执行except子句中的打印语句。
2.捕获多个异常
捕获多个异常需要在except之后以元组的形式指定多个异常类型。
示例代码:
num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
try:
print("结果为:",num_one/num_two)
except (ZeroDivisionError,ValueError)as error:
print("输入错误,错误原因为:",error)
运行结果:
稍微修改捕获单个异常的代码。以上代码的try子句在执行除法运算时,可能会因为除数为0使程序引发ZeroDivisionError异常,因为可能会因为使用非数值p引发ValueError异常。except子句中明确了捕获ZeroDivisionError或ValueError异常,因此程序在检测到ZeroDivisionError或ValueError异常时会执行except子句中的打印语句。
3.捕获全部异常
如果要捕获程序中的所有异常,那么可以将except之后的异常类型设置为Exception或神略不屑。需要主义的是,若省略异常类型,except子句中无法获得异常的具体信息,
将上述代码优化:
num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
try:
print("结果为:",num_one/num_two)
except Exception as error:
print("输入错误,错误原因为:",error)
2.2 异常结构中的else子句
else子句可以与try-except语句组合起来,若try监控的代码没有异常,程序会执行else子句后的代码。其语法格式如下:
try:
可能出错的代码
except[异常类型[暗示error]];
捕获异常后的处理代码
ekse:
没有异常的处理代码
示例代码:
num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
try:
res = num_one/num_two
except ZeroDivisionError as error:
print("输入错误:",error)
else:
print(res)
运行结果:
2.3 异常结构中的finally子句
语法结构:
try:
可能出错的代码
except[异常类型[暗示error]];
捕获异常后的处理代码
finally:
一定执行的代码
三、抛出异常
3.1使用raise语句抛出异常
rasie <异常类> #使用异常类名引发指定异常
rasie <异常类对象> #使用异常类的对象引发指定异常
rasie #使用刚刚出现过的异常重新引发异常
1.使用异常类引发异常
在语句执行时会先隐式地创建该语句中异常类的示例,然后才能引发异常
2.使用异常类对象引发异常
通过raise之后写入一个创建异常类对象,创建类异常对象海通过字符串指定下一场的具体信息。
3.重新引发异常
使用不带任何参数的”raise“语句,示例代码如下:
try:
raise IndexError('索引下标超出范围')
except:
raise
运行结果:
以上示例中try语句执行后会出现应raise语句引发的IndexError 异常,except子句会被执行,except子句后的代码又会使用raise语句抛出刚刚发生的IndexError异常,最终该程序因为再次抛出异常而终止执行。
3.2 使用assert语句抛出异常
assert语句又称断言语句语法格式如下;
assert 表达式 [,异常信息]
assert语句中后面紧跟着一个表达式,表达式的值为False时触发AssertionError的异常,值为Ture时不做任何操作,表达式之后可以使用字符串类描述异常信息。
示例代码:
num_one =int (input("请输入被除数:"))
num_two =int (input("请输入除数:"))
assert num_two !=0,'除数不能为0'
result = num_one/num_two
print(num_one,'/',num_two,'=',result)
运行结果:
以上代码实现会接受到用户输入的2个数num-one和num-two,并将 num-one和num-two分别作为被除数与·除数,然后使用assert语句判断num-two不等于0,若不等于0则进行除法运算,否则会引发AssertionError异常,并对其做出提醒输出结果。
四、自定义异常
代码举例:
class ShortInputError(Exception):
def _init_(self,length,atleast):
self.lenght=lenght #设置密码长度
self.atleast=atleast #限制密码长度
try:
text = input("请输入密码:")
if len(text)<3:
raise ShortInputError(len(text),3)
except ShortInputError as result:
print("ShortInputError:输入长度为%d,长度至少应为%d"%
(result,length,result,atleast))
else:
print("密码设置成功")
运行结果:
以上代码首先定义了一个继承Exception的ShortInputError类,并在ShortInputError中添加了两个属性length和atleast,其中length表示用户实际输入的密码长度,atleast表示程序限制的密码长度,然后通过try-except语句属兔捕获与处理用户应为输入不符合长度的密码而引发ShortInputError异常,若输入的密码长度小于3,则会抛出ShortInputError异常,否则则会提示密码设置成功