python 之 异常处理
异常基础
我们在写程序的时候难免会出现错误,一种为语法错误,即为python解释器的语法检测出来的错误,这种错误只能在我们执行程序之前及处理好。另一种为逻辑错误,这是我们在程序设计时出现得错误,也就是我们平时所说的bug。在编程过程中为了增加友好性,在程序出现bug的时候,一般不会将错误信息显示给用户,而是显示一个提示错误的页面。
异常种类
在python中不同异常可以用不同的类型去标识,不同的类对象标识不同的异常,一个异常标识一种错误。
什么是异常处理:
python解释器捕捉到错误,触发异常(程序员也可以自己触发异常)
程序员编写的特定的代码,专门用来捕捉这段异常(这段代码与逻辑无关,与异常处理有关)
如果捕捉成功,会进入另一个处理分支,使得程序不会崩溃,这就是异常处理。
为什么要进行异常处理:
python解释器在执行程序,检测到一个错误的时候,触发异常,异常触发后如果没有处理的情况下,程序会再当前异常终止,后面的代码就不会运行,这意味着你的程序崩溃了。
所以需要一种异常处理的机制来增强你程序的容错性。
如何进行异常处理:
首先,异常是由程序的错误引起的,但是语法上的错误跟异常处理无关,只能在程序运行前修正。
基本语法:
try: pass#被检测的代码块 except Exception as e: pass#错误提示
实例:
try: num = input('please input you num:') #遇到无法int的对象使用except捕捉 int(num) #捕捉Value 错误,返回错误 except ValueError as e: print(e) # 执行结果 #please input you num: name # invalid literal for int() with base 10: ' name'
在try 代码中只要出现异常,那么代码块中异常后面的代码就不会执行了,一个异常类只能用来处理指定的异常情况,如果非指定异常则无法处理。
多分支:
age = input('age:') try: int(age) except IndexError as e:#未捕捉到错误 print(e) except KeyError as e:#未捕捉到错误 print(e) except ValueError as e:#捕捉到错误 print('请输入数字') #######执行结果########## # age:f 输入类型不是数字 # 请输入数字 捕捉到错误,返回提示信息
多分支扩展:
print('执行结果'.center(30,"#")) age = input('age:') try: int(age) except IndexError as e: print(e) except KeyError as e: print(e) except ValueError as e: print('请输入数字') else: print('没try出来错误执行,try出来错误就不执行') finally: print('不管你有没有try出来错误都执行我') print('执行结果'.center(30,"#")) #############执行结果############# # age:ddd # 请输入数字 # 不管你有没有try出来错误都执行我 #############执行结果#############
万能异常
每一类错误都用一种类对象标识,太麻烦了,这个时候你就需要万能异常了,各种错误一网打尽。
但是还有三个漏网之鱼,SystemExit , KeyboardInterrupt 和 GeneratorExit 三个异常是Exception搞不定的。
print('执行结果'.center(30,"#")) age = input('age:') try: int(age) except Exception as e:#不使用ValueError照样能捕捉到错误 print(e) print('执行结果'.center(30,"#")) #############执行结果############# # age:s # invalid literal for int() with base 10: 's' #############执行结果#############
主动触发异常
print('执行结果'.center(30,"#")) try: raise TypeError('类型错误') except Exception as e: print(e) print('执行结果'.center(30,"#")) #############执行结果############# # 类型错误 #############执行结果#############
自定义异常
通过继承BaseException实现
print('执行结果'.center(30,"*")) class NaniException(BaseException): def __init__(self,msg): self.msg = msg def __str__(self): return self.msg try: raise NaniException('纳尼错误') except NaniException as e: #捕获NaniException print(e) finally: print('执行结果'.center(30,"*")) # *************执行结果************* # 纳尼错误 # *************执行结果*************
断言
判断条件成立,不成立就出现AssertionError异常
try: assert 1 == 1 print('第一个断言成功就执行') assert 2 == 1 print('第二个断言失败不执行') except Exception as e: print('抓到错误')
注意:
不要再任何地方都使用try......except,因为它本身就是你附加给你程序的一种异常处理的逻辑,与你的主要工作是没有关系的,大量使用,会导致你的程序的可读性变差,只有在有些异常无法预知的情况下,才应该使用try...... except,其它的逻辑错误应该尽量自行修正。