1、定义
异常(Exception)是程序执行过程中发生的错误或意外情况,可能导致程序终止。
2、异常的作用
3、分类
3.1、内置异常(Built-in Exceptions)
Python提供了大量内置异常类,常见类型如下:
3.2、自定义异常
通过继承 Exception 或其子类创建自定义异常。
4、捕获异常
try --- except---else --- finally在程序运行过程中,不能因为遇到某些小异常就让整个程序彻底崩溃。 应该假设某处会出现异常,提前做好准备,当真的出现异常时可以处理异常。
4.1、捕获指定异常
使用 try 和 except 关键字可以捕获并处理异常,在 except 中可以指定要捕获的异常类型。基本语法如下
class TestDemo(object): def fun(a, b): try:# 可能引发异常的代码块 return a / b# 防止 b = 0 except ZeroDivisionError as e:# 捕获除数为0的异常# 处理对应的异常 handler_exception(e)
try: 可能引发异常的代码块。except: 指定要捕获的异常类型,并处理该异常。如果代码的异常类型和要捕获的异常类型不一致,则无法捕获异常。as e 允许将异常实例赋值给变量e,以便在异常处理代码中使用。
4.2、捕获多个异常
class TestDemo(object): def fun(a, b): try:# 可能引发异常的代码块 print(d) return a / b except (ZeroDivisionError, AttributeError) as e: # 处理对应的异常 handler_exception(e)
4.3、捕获全部异常
当不知道代码块会出现哪些异常,总会有意外的出现,就是用通用的异常 Exception, 这样可以捕捉到隐藏的异常问题。使用 except 或 except Exception as e 可以捕获所有内建异常(不包括SystemExit、KeyboardInterrupt和GeneratorExit),但不包括从BaseException直接继承的其他异常。
class TestDemo(object): def fun(a, b): try:# 可能引发异常的代码块 return a / b except Exception as e: # 处理对应的异常 handler_exception(e)
4.4、捕获未知异常
使用 except BaseException as e 可以捕获所有异常,包括那些从 BaseException 直接继承的异常。
class TestDemo(object): def fun(a, b): try:# 可能引发异常的代码块 return a / b except BaseException as e: # 处理对应的异常 handler_exception(e)
5、else 和 finally 的使用
5.1、else 子句
若try 中没有发生异常,那么可继续执行 else 中的代码块
class TestDemo(object): def fun(a): try:# 可能引发异常的代码块 return a except BaseException as e: # 处理对应的异常 handler_exception(e) else: print(”程序未发生异常,可以执行else代码块”)
5.2、finally 子句
无论是否会发生异常,finally代码块都会被执行,一般用于释放资源(关闭连接,文档等)。
class TestDemo(object): def fun(a): try:# 可能引发异常的代码块 return a except BaseException as e: # 处理对应的异常 handler_exception(e) else: print(”程序未发生异常,可以执行else代码块”) finally: print(”最终关闭所有资源”)
6、自定义异常
在开发项目中可以根据自己的需求,自定义一些异常,在发生对应的问题后,捕获异常。可以通过继承 Exception 类来实现该功能。
class MyApiException(Exception): def __init__(self, code, message): super().__init__(message) self.error_code = codeclass TestDemo(object): def fun(): try: raise MyApiException(500, ”用户名或密码错误!!!”) except: MyApiException as e : print(f”fail: code:{e.code}, conext: {e}”)
7、raise 手动触发异常
raise 关键字可以手动触发异常
class TestDemo(object): def fun(): if 1 < 0 : raise Exception(”数据错误”)
7、异常传递
在try 代码块中发生了异常,但是没有 except 捕获异常,那么异常会逐层向上传递,直到有except捕获的地方,或者没有处理程序崩溃了才会停止。
class TestDemo(): def fun1(a, b): return a / b def fun2(): try: fun1(1,0) except ZeroDivisionError as e: print(”除数不可以为0”)fun2()