python的异常处理
一.异常引入
异常概念: 程序在运行过程中发生不可预知的错误,程序员很难堵住所有的漏洞,就需要异常处理
二.异常处理
异常处理:
捕获异常: try-except-else-finally
将可能发生异常的代码,放入try-except中
else:当代码没有异常就会执行else,如果代码块中有return,else将不执行
finally:无论有没有异常或有没有return,finally一定是最终执行的代码
抛出异常: raise
当代码符合语法要求但不符合现实业务,就可以抛出异常
python
try:
a = float(input('请输入第一个数:'))
b = float(input('请输入第二个数:'))
print(a / b)
except ValueError as e:
print('请输入纯数字')
except ZeroDivisionError as e:
print('除数不能为0')
except Exception as e:
print(e)
else:
print('没有异常,就会进入else')
finally:
print('最终要执行的代码')
在以上代码中,try内是我们要测试的代码,当输入的不是纯数字时,会引发ValueError错误,当除数为0时,会引发ZeroDivisionError错误,我们也可以用Exception捕获其他类型的异常,如果没有异常会执行else内部的代码,最终会执行finally内部的代码。
三.常见异常
Exception :所有异常的基类。
AttributeError :尝试访问对象属性失败时引发。例如,访问不存在的对象属性。
IOError(在Python 3中为OSError) :输入/输出操作失败时引发。例如,文件读写错误。
ImportError :无法导入模块或包时引发。例如,尝试导入不存在的模块。
IndexError :索引超出序列范围时引发。例如,访问列表的非法索引。
KeyError :尝试访问字典中不存在的键时引发。
KeyboardInterrupt :用户中断执行(通常是Ctrl+C)时引发。
MemoryError :内存不足,无法分配新对象时引发。
NameError :尝试访问未声明的变量时引发。
NotImplementedError :抽象基类中的方法未在派生类中实现时引发。
OSError :操作系统错误。这是IOError的基类,用于更广泛的操作系统相关问题。
OverflowError :数值运算结果过大,无法表示时引发。
RecursionError :递归调用层次过深时引发。
ReferenceError :弱引用试图访问已经垃圾回收的对象时引发。
RuntimeError :在解释器执行期间检测到的一般错误。
SyntaxError :代码语法错误时引发。注意,这通常是在代码编译时捕获的,而不是在运行时。
SystemExit :请求解释器退出时引发。通常由sys.exit()函数引发。
SystemError :解释器遇到内部错误时引发。
TypeError :操作或函数应用于不适当类型的对象时引发。例如,尝试对非数字执行数学运算。
UnboundLocalError :尝试访问未绑定的局部变量时引发。
UnicodeError :涉及Unicode相关的操作时发生错误时引发。它是几个与Unicode相关的异常的基类。
ValueError :操作或函数接收到具有正确类型但不适合该操作的参数时引发。例如,将字符串转换为整数时提供的字符串不是有效的整数表示。
ZeroDivisionError:除法或取模运算的第二个参数为零时引发。
四.断言
断言是一种用于调试目的的机制,它允许我们在代码中设置检查点,以确保在程序运行到某个点时,程序的某个状态(如变量的值)满足特定的条件。
python
a = int(input('请输入数字:'))
assert a > 20, 'a不大于20'
print(a)
在以上代码中,当输入的数字小于或者等于20时,将会抛出带有自定义错误信息的'AssertionError: a不大于20',当输入的数字大于20时,将会打印a的值。
五.自定义异常
python中我们可以通过继承内置的Exception类或其子类来创建自定义异常。自定义异常允许我们定义具有特定含义和行为的错误类型。
python
class AgeError(Exception):
def __init__(self, message):
self.message = message
try:
age = int(input('请输入年龄:'))
if age < 0 or age > 150:
raise AgeError('年龄在0-150')
except AgeError as e:
print(e)
在以上代码中我们定义了一个年龄相关的异常,在自定义异常类中,重写了__init__ 方法用于接收一个错误消息作为参数。这个错误消息可以在捕获异常时被打印出来。在下方的测试中,当输入的年龄小于 0 或大于 150时,程序会抛出 AgeError 异常,并打印出错误消息 "年龄在0-150"。