Python面向对象之异常
异常的概念
- 程序在运行时,如果python解释器遇见一个错误,就会停止程序的运行,并且提示一些错误信息,这就是异常;
- 程序遇见错误停止执行并且提示错误信息,这个动作我们称之为抛出(raise)异常;
异常有可能是我们没有按照代码规范而引起的;
但也有可能即使按照代码规范编写,也会出错,比如我们提示用户输入一个数字,然后int转译,但用户输入一个非数字,就会报错;
程序开发时,很难将所有情况都处理的面面俱到,通过异常捕获可以针对突发事件做集中的处理,从而保证程序的稳定性和健壮性;
捕获异常
简单的异常捕获
在程序开发中,如果对某些代码的执行不能确定是否会正确执行,我们可以增加try(尝试)来捕获异常;
捕获异常最简单的语法格式:
try: 尝试执行的代码 except: 出现错误的处理
try 尝试,下方编写要尝试代码,不确定是否能够正确执行的代码;
except 如果不是,下方编写尝试失败的代码;
简单异常捕获示例
try: # 不能确定是否会正确执行的代码 num = int(input("请输入一个整数:")) except: # 处理出现错误之后代码 print("请确保你输入的是一个整数") print("-"*50) # 请输入一个整数:1 # -------------------------------------------------- # 请输入一个整数:a # 请确保你输入的是一个整数 # --------------------------------------------------
错误类型捕获
在程序执行时,可能会遇到不同类型的异常,并且需要针对不同类型的异常,做出不同的响应,这个时候,就需要使用错误类型捕获了。
错误类型捕获语法如下:
try: # 尝试执行的代码 pass except 错误类型1: # 针对错误类型1,对应的代码处理 pass except (错误类型2,错误类型3): # 针对错误类型2和3,对应的代码处理 pass # 下面三句是后面的内容 except Exception as e: print("未知异常:", e)
当python解释器抛出异常后,最后一行错误信息的第一个单词,就是错误类型,例如下面,错误信息就是 ZeroDivisionError;
ZeroDivisionError: division by zero
错误类型捕获代码演示
while 1: try: num = int(input("请输入一个整数:")) result = 8/num print("8除以这个数字的结果是:", result) break except ZeroDivisionError: print("你输入的是一个0,不能被除,请重新输入") continue except ValueError: print("请确保你输入的是一个整数,请重新输入") continue except Exception as e: print("出错了:%s ,请重新输入", e) continue # 请输入一个整数:0 # 你输入的是一个0,不能被除,请重新输入 # 请输入一个整数:a # 请确保你输入的是一个整数,请重新输入 # 请输入一个整数:2 # 8除以这个数字的结果是: 4.0
捕获未知异常
在开发时,要预判到所有可能出现的错误,是很难的;
如果希望程序无论出现任何错误,都不会因为python解释器抛出异常而被终止,可以增加如下语句:
except Exception as e: print("出错了:%s ,请重新输入", e)
捕获未知异常演示
while 1: try: num = int(input("请输入一个整数:")) result = 8/num print("8除以这个数字的结果是:", result) break except ValueError: print("请确保你输入的是一个整数,请重新输入") continue except Exception as e: print("出错了:%s ,请重新输入", e) continue # 请输入一个整数:a # 请确保你输入的是一个整数,请重新输入 # 请输入一个整数:0 # 出错了:division by zero ,请重新输入 # 请输入一个整数:1 # 8除以这个数字的结果是: 8.0
异常捕获完整语法
在实际开发中,为了能够处理复杂的异常情况,完整的异常语法如下:
try: # 尝试执行的代码 pass except 错误类型1: # 针对错误类型1,对应的代码处理 pass except (错误类型2,错误类型3): # 针对错误类型2和3,对应的代码处理 pass except Exception as e: print("未知异常:", e) else: # 没有异常才会执行的代码 pass finally: # 无论是否出现异常都会执行的代码 pass
- else 是 只有在没有异常时才会执行的代码;
- finally 是 无论是否出现异常都会执行的代码;
异常捕获完整语法示例
while 1: try: num = int(input("请输入一个整数:")) result = 8/num print("8除以这个数字的结果是:", result) except ZeroDivisionError: print("你输入的是一个0,不能被除,请重新输入") continue except ValueError: print("请确保你输入的是一个整数,请重新输入") continue except Exception as e: print("出错了:%s ,请重新输入" % e) continue else: print("代码正常执行") break finally: print("无论是否出现异常都会执行的代码")
异常的传递
- 异常的传递:当代码/方法执行出现异常,会将异常传递给函数/方法的调用一方;
- 如果传递到主程序,还没有处理异常,程序才会被终止;
提示:
- 在开发中,可以给主程序增加异常处理;
- 而在主程序中调用其他的函数,只要出现异常,就会传递给主程序的异常捕获;
- 这样就不需要在函数/方法中,增加大量的异常捕获,可以保证代码的整洁性;
异常传递处理示例
def demo1(): num = int(input("请输入一个整数:")) return num def demo2(): return demo1() # 利用异常的传递性,在主程序捕获异常 try: result = demo2() print(result) except ValueError: print("请确保你输入的是一个整数") except Exception as e: print("出错了:%s " % e)
抛出(raise)异常
抛出异常应用场景
在程序中,除了代码出错解释器会抛出异常之外,还可以根据应用程序 特定业务需求 主动抛出异常;
例如:注册时,如果用户输入的密码少于8位,抛出异常提醒长度不够;
注意:
当前函数,只提醒用户输入密码,如果密码长度不够,需要其他额外的函数进行异常处理;
因此可以抛出异常,由其他需要处理的函数捕获异常.
抛出异常
python中提供了一个Exception异常类;
在开发时,如果满足特定业务需求时,希望抛出异常,可以:
1.创建一个Exception类的对象 2.使用raise关键字抛出异常对象
主动抛出异常示例
def input_pwd(): pwd = input("请输入密码:") if len(pwd) >= 8: return pwd # 创建异常对象,可以使用错误信息字符串作为参数 short_pwd = Exception("密码长度小于8位") # 主动抛出异常 raise short_pwd try: password = input_pwd() print(password) except Exception as e: print("出错了:", e)
- python面向对象类学习以及异常
- 文成小盆友python-num8 面向对象中的成员,成员修饰符,特殊成员,异常处理,设计模式之单例模式
- Python基础—13-面向对象及异常处理
- 2.1.3 Python面向对象之异常处理
- Python面向对象和异常
- python面向对象基础
- python面向对象之类
- python面向对象初级
- Python-面向对象进阶
- python(六)面向对象学习--类
- python面向对象(封装、继承、多态)+ 面向对象小栗子
- [零基础学JAVA]Java SE面向对象部分-20.异常的捕获与处理 推荐
- python3 面向对象__类的内置属性与方法的实例代码
- DAY6之Python学习笔记:面向对象术语整理
- 面向对象的python(一)
- Python 深入浅出 - 面向对象
- python3的面向对象
- 【Python】Learn Python the hard way, ex41 面向对象术语练习
- Python面向对象类编写细节分析【类,方法,继承,超类,接口等】
- pythond对象、异常、反射的学习笔记