天天看点

14、错误处理

错误

  • 语法错误(SyntaxError)
  • 逻辑错误

异常

  • 语法和逻辑没有问题,程序执行过程中出现未知错误
  • 如:除零报错、字典或列表索引超出范围等等

常见系统异常

  • 除零错误 ZeroDivisionError
  • 名称异常 NameError
  • 类型异常 TypeError
  • 索引异常 IndexError
  • 键异常 KeyError
  • 值异常 ValueError
  • 属性异常 AttributeError
  • 迭代器异常 StopIteration

系统异常类继承树

​ BaseException–>Exception、SystemExit、GeneratorExit、Keyboardlnterrupt

  • BaseException是所有内建的异常的基类
  • Keyboardlnterrupt:当用户点击中断键 (通常ctrl + C) 时引发
  • GeneratorExit:当调用一种generator的close()方法时引发
  • SystemExit:由sys.exit()函数引发。当它不处理时,Python 解释器退出
  • Exception 是 所有内置的、 非系统退出异常是从该类派生的。

    应该从该类派生所有用户定义的异常。

解决异常-预防

​ 添加容错代码

解决异常-捕获

​ 语法

try:
    可能会出现异常的代码
except 捕捉的异常类别 as 接收异常的参数: 
    对应这个异常的代码处理
[可以有多个except重复, 用于捕捉可能的其他异常; 
如果针对于多个不同的异常有相同的处理方式, 那么可以将多个异常合并]
else:(可省去)
    没出现异常时做的处理
finally:(可省去)
    代码块
    不管有没有出现异常,都会执行该代码块
           

注意

  • try语句没有捕捉到异常,先执行try代码块,再执行else代码块,最后执行finally代码块
  • 如果try捕捉到异常,首先执行except处理错误,再执行finally
  • 如果异常名称不确定的,而又想捕捉,那么except 后的捕捉异常类别可直接写Exception
除法运算
def num1(a,b):
    res = a / b
    print(res)

def num2(a,b):
    try:
        res = a / b
    except ZeroDivisionError as z:
        print("错误处理",z)
    else:
        print(res)
    finally:
        print("good")

num2(2,1)
运行结果:
2.0
good

num2(2,0)
运行结果:
错误处理 division by zero
good
           

手动抛出异常

  • 通过 raise 语句直接抛出相关类型的异常
  • 什么时候应该向外界抛出异常?
  • 什么时候应该内部做好容错处理?
def age(age):
    if age <= 0 or age > 100:
        raise ValueError('赋值错误')
    else:
        print("设置的age为:",age)

try:
    age(500)
except ValueError as v:
    print(v)

运行结果:
	赋值错误
           

自定义异常

  • 继承与父类:Exception

继续阅读