关于错误和异常
(1)概念:错误是无法通过其他代码进行处理问题,如语法错误和逻辑错误,语法错误是单词或格式等写错,只能根据系统提示去修改相应的代码,逻辑错误是代码实现功能的逻辑有问题,系统不会报错,也是只能找到相应的代码进行修改;异常是程序执行过程中,出现的未知问题,这里语法和逻辑都是正确的,可以通过其他代码进行处理修复,如可以通过if判定语句来避免对年龄进行赋值时输入了字符而出现异常的情况,如使用捕捉异常可以避免除零异常等
(2)关于常见的系统异常:
除零异常(ZeroDiviceError):被除数写成了0
名称异常(NameError):变量未定义
类型异常(TypeError):不同类型数据进行相加
索引异常(IndexError):超出索引范围
键异常(KeyError):没有对应名称的键
值异常(ValueError):将字符型数据转换成整型数据
属性异常(AttributeError):对象没有对应名称的属性
迭代器异常(StopIteration):迭代次数超出迭代器内容个数、
(3)关于python异常的继承关系树图
(4)异常的解决思路
系统内置了很多应用场景,我们在运行程序过程中,一旦触发相关场景,系统就会向外抛出相应的问题,这就是系统抛出的异常
预防:添加容错处理,代码虽会触发异常,但使用容错处理可以不让异常被触发
解决:如果容错代码过多时,会使得整个程序非常混乱,这时可以使用捕捉异常进行处理
解决方案1--捕捉异常的完整机构如下:
注意1:
try:1 / 0print(name)
except ZeroDivisionError as z:print("除零错误")
except NameError as n:print("名字错误")
else:print("代码没错")
finally:print("后续代码执行")
# -------运行结果-------
# 除零错误
# 后续代码执行
这里当1 / 0 执行时,出现异常,会跳过print(name)去执行except ZeroDivisionError as z:进行捕捉,从而不会去执行print(name),故后面对其的捕捉也是无效的
注意2:
try:# 1 / 0print(name)
except (ZeroDivisionError, NameError) as z:print("异常")
else:print("代码没错")
finally:print("后续代码执行")
# -------运行结果-------
# 异常
# 后续代码执行
这里如果对多个异常的处理是相同的,则可以将这些异常进行合并处理
注意3:
try:# 1 / 0print(name)
except Exception as z:print("异常")
else:print("代码没错")
finally:print("后续代码执行")
# -------运行结果-------
# 异常
# 后续代码执行
如果不知道具体是什么异常,可以直接使用Exception进行捕捉,因为这些常见的异常都是继承自Exception的
注:except和else语句只执行一个
(8)自定义异常
1) 用户自定义异常首先需要继承Exception类
2) raise语句的语法格式为:
raise [Exception [, args [, traceback]]]
语句中 Exception 是异常的类型(例如,NameError)参数标准异常中任一种,args 是自已提供的异常参数。
最后一个参数是可选的(在实践中很少使用),如果存在,是跟踪异常对象。
3)为了能够捕获异常,"except"语句必须有用相同的异常(或者直接抛出Exception)来抛出类对象或者字符串。
4)当类自己定义了__str__(self)
方法,那么当raise这个类实例时,就会返回从这个方法中return的数
class Xerror(Exception):def __init__(self, mag, code_error):self.mag = magself.code_error = code_errorpassdef __str__(self):return self.mag + str(self.code_error)
def ageSet(age):if age <= 0 or age > 200:raise Xerror("不符合", 404)else:print("小明的年龄是%d" % age)
try:ageSet(-18)
except Exception as x:print("cunwu", x)
由于常见异常都是继承自Exception类的,座椅这里可以自定义一个继承了Exception的子类,在向外抛出异常时,即raise Xerror("不符合", 404) ,可以看成是创建一个Xerror实例对象,并对其初始化属性进行赋值,然后利用__str__()方法对实例对象进行描述,这就是自定义异常的方法,在最后可以对抛出的异常进行捕捉
实现异常类,比较好的做法是:将所有自定义异常放在一个单独的文件中(例如:exceptions.py
或 errors.py
),许多标准模块也都是这样做的。
既然自定义异常是类,那么它必然可以实现一个普通类能做的所有事情。但一般而言,应该尽量保持简单、简洁。大多数实现都是声明一个自定义基类,并从这个基类派生出其他的(由程序引发的)异常类。这是 Python 中实现自定义异常的标准方法,但并不仅限于这种方式。
总结:
- 自定义异常类需要继承自Exception类。
- 自定义异常类需要实现__str__方法来定义需要抛出的异常信息。
- raise语句主动抛出异常。
- 捕获异常需要通过try...except 语句,其中"except"语句必须有用相同的异常(或者直接抛出Exception)来抛出类对象。
参考自https://blog.csdn.net/zx870121209/article/details/81477329
https://blog.csdn.net/qq_35462323/article/details/91418650?biz_id=102&utm_term=python%20%E8%87%AA%E5%AE%9A%E4%B9%89%E5%BC%82%E5%B8%B8&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-0-91418650&spm=1018.2118.3001.4187