异常基础
我们在写程序的时候难免会出现错误,一种为语法错误,即为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,其它的逻辑错误应该尽量自行修正。