Python 异常处理
异常分类程序中难免出现错误,总共可分为两种。
对于刚接触编程的人来说,这两个错误都会经常去犯,但是随着经验慢慢的积累,语法错误的情况会越来越少反而逻辑错误的情况会越来越多(因为工程量巨大)。不论多么老道的程序员都不可避免出现这两种错误。 异常的三大信息
常用的异常类 在Python中一切皆对象,异常本身也是由一个类生成的,
异常处理我们可以来用某些方法进行异常捕捉,当出现异常时我们希望代码以另一种逻辑运行,使得我们的程序更加健壮,这个就叫做异常处理。异常处理是非常重要的,本身也并不复杂,千万不可马虎大意。 但是切记不可滥用异常处理,这会使得你的代码可读性变差。 if else处理异常 # ==== if else 处理异常 ==== while 1: select = input("请输入数字0进行关机:").strip() if select.isdigit(): 我们可以防止用户输入非数字的字符 if select == 0: print(正在关机...) break 输入有误,请重新输入) ==== 执行结果 ==== """ 请输入数字0进行关机:关机 输入有误,请重新输入 请输入数字0进行关机:关机啊 输入有误,请重新输入 请输入数字0进行关机:0 正在关机... """ 这种异常处理机制虽然非常简单,但是并不灵活,我们可以使用更加简单的方式来处理他们。 try except处理异常
==== try except 执行流程 有异常的情况 ==== li = [1,2,3] try: 开始执行我try了...) print(li[10]) 出错点... 继续执行我try...) except IndexError as e: 有异常执行我except...正常逻辑代码... 开始执行我try了... 有异常执行我except... 正常逻辑代码... """? ==== try except 执行流程 无异常的情况 ==== print(li[2]) 开始执行我try了... 3 继续执行我try... 正常逻辑代码... ==== try except 处理异常 ==== try: try检测可能出错的语句,一旦出错立马跳转到except语句块执行代码。 select = int(input().strip()) if select == 0: break 输入有误,请重新输入...except ValueError as e: 当执行完except的代码块后,程序运行结束,其中e代表的是异常信息。 错误信息是:,e) 请输入数字0进行关机:1 输入有误,请重新输入... 请输入数字0进行关机:tt 错误信息是: invalid literal for int() with base 10: 'tt' 输入有误,请重新输入 请输入数字0进行关机:0 正在关机... """ 多段except捕捉多异常 我们可以使用 ==== 多段 except 捕捉多异常 ==== : li = [1,3,4] dic = {name":Yunya",age":18} li_index = input(请输入索引:) dic_key = input(请输入键的名称:) if li_index.isdigit(): li_index = int(li_index) : print(li[li_index]) (dic[dic_key]) except IndexError as e1: 注意,先抛出的错误会直接跳到其处理的except代码块,而try下面的语句将不会被执行。 索引出错啦! KeyError as e2: 键出错啦! 请输入索引:10 请输入键的名称:gender 索引出错啦! 请输入索引:2 请输入键的名称:gender 3 键出错啦! """ 元组捕捉多异常 使用多段 ==== 元组捕捉多异常 ==== except (IndexError,KeyError) as e: 使用()的方式可以同时捕捉很多异常。 出错啦! 请输入索引:10 请输入键的名称:gender 出错啦! 请输入索引:2 请输入键的名称:gender 3 出错啦! """ 可以看到,不管是那种错误都只有一种应对策略,如果我们想要多种应对策略就只能写 (IndexError,KeyError) as e: 判断异常类型再做出相应的对应策略 isinstance(e,IndexError): ) elif""" 万能异常Exception 我们可以捕捉 ==== 万能异常Exception ==== except Exception as e: 使用 Exception来捕捉所有异常。 """ try except else联用 这种玩法比较少,
==== try except else联用 有异常的情况==== else没有异常执行我else...""" ==== try except else联用 无异常的情况==== 开始执行我try了... 3 继续执行我try... 没有异常执行我else... 正常逻辑代码... """ try except finally联用
==== try except else finally 执行流程 有异常的情况 ==== finally不管有没有异常都执行我finally... 开始执行我try了... 有异常执行我except... 不管有没有异常都执行我finally... 正常逻辑代码... ==== try except else finally 执行流程 无异常的情况 ==== 开始执行我try了... 3 继续执行我try... 没有异常执行我else... 不管有没有异常都执行我finally... 正常逻辑代码... """ 自定义异常raise主动抛出异常 在某些时候我们可能需要主动的去阻止程序的运行,主动的抛出一个异常。可以使用 ==== raise使用方法 ==== ----1--------2--------3----raise Exception(我也不知道是什么类型的异常...----4--------5--------6---- ----1---- ----2---- ----3---- Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/learn/元类编程.py",line 6,in <module> raise Exception("我也不知道是什么类型的异常...") Exception: 我也不知道是什么类型的异常... Process finished with exit code 1 """ 自定义异常类 前面已经说过一切皆对象,异常也来自一个对象。因此我们也可以自己来定制一个对象。注意,自定义异常类必须继承 ==== 自定义异常类 ==== class MyError(BaseException): pass raise MyError(我的异常) Traceback (most recent call last): File "C:/Users/Administrator/PycharmProjects/learn/元类编程.py",in <module> raise MyError("我的异常") __main__.MyError: 我的异常 """ 扩展:断言assert 断言是一个十分装逼的使用,假设多个函数进行计算,我们已经有了预期的结果只是在做一个算法的设计。如果函数的最后的结果不是我们本来预期的结果那么宁愿让他停止运行也不要让错误继续扩大,在这种情况下就可以使用断言操作,使用断言会抛出一个 # ==== 断言assert ==== def calculate(): 假设在做非常复杂的运算""" return 3 + 2 * 5 res = calculate() assert res == 25,(只有当函数的结果为25时,这条错误才不会被执行。我是提示信息...) # AssertionError print(算法测试通过!你真的太厉害了) # ==== 执行结果 ==== """ Traceback (most recent call last): File D:/DjangoProject/djangoAdmin/.vscode/one.py10,in <module> assert res == ) # AssertionError AssertionError: 只有当函数的结果为25时,这条错误才不会被执行。我是提示信息... """ ? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |