1. 异常处理

try:
    int(input('请输入数字:'))

except ValueError:
    print('数据类型有误')

2. 多分支的异常处理

try:
    name
    int(input('请输入数字:'))

except NameError:
    print('name 没有定义')
except ValueError:
    print('数据类型有误')

3. Exception 万能异常 -> 什么异常类型都可以匹配到

  • 如果使用了多分支且又用了万能异常,将万能异常放在分支的最后面 

try:
    [][1]

except NameError:
    print('name 没有定义')
except ValueError:
    print('数据类型有误')
except Exception:
    print('万能异常')

  • Exception as xxx -> xxx 返回是什么类型的异常

try:
    [][1]


except NameError:
    print('name 没有定义')
except ValueError:
    print('数据类型有误')
except Exception as sort:
    print(sort)  # list index out of range
    print('万能异常')

  • 当主动抛出 Exception 异常并且传递参数的时候,在捕获 Exception 异常的时候可以获取到传递的参数

try:
    raise Exception('异常信息')

except Exception as e:
    print(e)  # 异常信息

4.else

  • 没有异常的时候执行 else 中的代码

try:
    int(input('请输入数字:'))


except NameError:
    print('name 没有定义')
except ValueError:
    print('数据类型有误')
except Exception as sort:
    print(sort)  # list index out of range
    print('万能异常')
else:
    print('没有发生异常')

5.finally

  • 不管代码是否异常都会执行

try:
    int(input('请输入数字:'))

except NameError:
    print('name 没有定义')
except ValueError:
    print('数据类型有误')
except Exception as sort:
    print(sort)  # list index out of range
    print('万能异常')
else:
    print('没有发生异常')
finally:
    print('不管代码是否异常都会执行')

  • finally 一般是用于函数里做异常处理用的,不管是否异常去做一些收尾工作

def open_file():
    try:
        f = open('file', 'w', encoding='utf-8')
    except Exception:
        print('发生异常了')
    finally:
        print('不管代码是否异常都会执行')
        f.close()  # 无论是否发生了异常都要关闭文件,此时无需在在异常中和try中写

open_file()

  • 当函数中有 return 的时候 finally 中的代码依然会被执行

def open_file():
    try:
        f = open('file', 'w', encoding='utf-8')
        return True
    except Exception:
        print('发生异常了')
        return False
    finally:
        print('不管代码是否异常都会执行')
        f.close()


print(open_file())

6.自定义异常类

  • 使用场景: 根据不同的错误返回不同的状态,一般在编写接口的时候用的比较多

class MyException(Exception):  # 通过继承 Exception 类实现自定义异常类
    def __init__(self, code, msg):
        self.code = code,
        self.msg = msg


try:
    raise MyException(1000, '自定义错误')  # 主动抛出自定义异常

except MyException as me:  # 捕获自定义的异常
    print(me.code)  # 1000
    print(me.msg)  # 自定义错误
except Exception as e:  # 捕获所有异常
    print(e)