所有异常类都是继承Exception
Python 有两种错误很容易辨认:语法错误和异常。
即便 Python 程序的语法是正确的,在运行它的时候,也有可能发生错误。
运行期检测到的错误被称为异常。
大多数的异常都不会被程序处理,都以错误信息的形式展现在出来
捕获简单异常
try:
# 语句块
#这里放的是可能遇到异常的代码
except:
# 异常处理代码
# 遇到异常输出的代码
else:
# 没有遇到异常时执行的代码块
finally:
# 无论有没有异常都要执行的代码
注:这个语法,不会分辨是什么类型的异常,只要遇到异常就会执行except里面的代码块
捕获多个异常
try:
# 可能存在异常的代码
except(异常名称 1,异常名称2,异常名称3):
# 异常处理代码
# 遇到异常时执行的代码
else:
# 没有遇到异常时执行的代码块
finally:
# 无论有没有异常都要执行的代码
注:这个语法只要遇到括号中的异常就执行except下的代码块,不会根据不同的异常执行不同的代码
并且这个不区分优先级
分类处理多个异常
try:
可能存在异常的代码
except (异常名称1):
# 异常1的处理代码
except (异常名称2):
# 异常2的处理代码
else:
# 没有遇到异常时执行的代码块
finally:
# 无论有没有异常都要执行的代码
这个是有优先级的
执行try下的语句,如果引发异常,则执行过程会跳到第一个except语句。
如果第一个except中定义的异常与引发的异常匹配,则执行该except中的语句。
如果引发的异常不匹配第一个except,则会搜索第二个except,允许编写的except数量没有限制。
如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。
主动触发异常(抛出异常)
语法
raise [Exception [,args ] [,traceback]]
Exception是 异常的类型(例如ValueError),
参数是一个异常参数值。该参数是可选的,如果不提供,异常的参数是"None(空)" 就是异常错误信息
最后一个参数是跟踪异常对象,也是可选的
列子:
def not_zero(num):
try:
if num == 0:
raise Exception('参数错误')
return num
except Exception as e :
print(e) # 打印异常错误信息
not_zero(0)
返回异常发生位置
先导入traceback库
使用traceback.format_exc()函数或者 traceback.print_exc()
format_exc()返回字符串
print_exc()则直接给打印出来
使用案例:
import traceback
try:
t=0
if t==0:
raise Exception('t==0了',)
except Exception as c:
print(c)
traceback.print_exc()
else:
print("没有异常执行")
finally:
print("有没有异常都要执行的")
自定义异常
可以通过创建一个新的异常类来拥有自己的异常。
异常类继承自 Exception 类,可以直接继承,或者间接继承
import traceback
class dj(Exception):
def __init__(self,value):
self.value=value
def __str__(self):
return repr(self.value)
# 注:repr()函数简单来说就是转字符串的
try:
3/0
except dj as c:
print(c)
traceback.print_exc()
else:
print("没有异常执行")
finally:
print("有没有异常都要执行的")