python之异常处理

关于错误和异常

(1)概念:错误是无法通过其他代码进行处理问题,如语法错误和逻辑错误,语法错误是单词或格式等写错,只能根据系统提示去修改相应的代码,逻辑错误是代码实现功能的逻辑有问题,系统不会报错,也是只能找到相应的代码进行修改;异常是程序执行过程中,出现的未知问题,这里语法和逻辑都是正确的,可以通过其他代码进行处理修复,如可以通过if判定语句来避免对年龄进行赋值时输入了字符而出现异常的情况,如使用捕捉异常可以避免除零异常等

(2)关于常见的系统异常:

除零异常(ZeroDiviceError):被除数写成了0

名称异常(NameError):变量未定义

类型异常(TypeError):不同类型数据进行相加

索引异常(IndexError):超出索引范围

键异常(KeyError):没有对应名称的键

值异常(ValueError):将字符型数据转换成整型数据

属性异常(AttributeError):对象没有对应名称的属性

迭代器异常(StopIteration):迭代次数超出迭代器内容个数、

(3)关于python异常的继承关系树图

(4)异常的解决思路

系统内置了很多应用场景,我们在运行程序过程中,一旦触发相关场景,系统就会向外抛出相应的问题,这就是系统抛出的异常

预防:添加容错处理,代码虽会触发异常,但使用容错处理可以不让异常被触发

解决:如果容错代码过多时,会使得整个程序非常混乱,这时可以使用捕捉异常进行处理

解决方案1--捕捉异常的完整机构如下:

注意1:

try:
    1 / 0
    print(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 / 0
    print(name)
except (ZeroDivisionError, NameError) as z:
    print("异常")
else:
    print("代码没错")
finally:
    print("后续代码执行")
# -------运行结果-------
# 异常
# 后续代码执行

这里如果对多个异常的处理是相同的,则可以将这些异常进行合并处理

注意3:

try:
    # 1 / 0
    print(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 = mag
        self.code_error = code_error
        pass
    def __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

你可能感兴趣的:(python基础学习)