python 之 异常处理

时间:2021-09-07 00:21:12

异常基础

我们在写程序的时候难免会出现错误,一种为语法错误,即为python解释器的语法检测出来的错误,这种错误只能在我们执行程序之前及处理好。另一种为逻辑错误,这是我们在程序设计时出现得错误,也就是我们平时所说的bug。在编程过程中为了增加友好性,在程序出现bug的时候,一般不会将错误信息显示给用户,而是显示一个提示错误的页面。

异常种类

在python中不同异常可以用不同的类型去标识,不同的类对象标识不同的异常,一个异常标识一种错误。

python 之 异常处理常见异常 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,其它的逻辑错误应该尽量自行修正。