Python基础 -- 异常处理
try-except
写代码过程中难免会出现异常,比如:
执行 a=10/0 时会提示:ZeroDivisionError: division by zero
直接执行 a 会提示: NameError: name 'a' is not defined
执行 import mokuai (模块库中没有的模块) 会提示: ModuleNotFoundError: No module named 'mokuai'
这些错误类型如ZeroDivisionError、NameError、ModuleNotFoundError等都是继承自Python标准库里的Exception类中的异常对象类,而程序在运行过程中报出这些错误时会影响程序后续的运行,如果不想因为这里发生错误导致影响程序后续运行则需要使用try...except...
来捕获和处理异常,如下所示
try:
100/0
except ZeroDivisionError as e:
print (f'异常对象信息:{e}')
但是这是在明知会发生ZeroDivisionError的情况下做的处理,如果不知道会出现什么类型的错误,并且希望无论发生什么错误也不要影响程序的后续运行,则需要匹配全类型的异常,如下所示:
try:
100/0
except Exception as e:
print (f'异常对象信息:{e}')
除此之外还可以去自定义错误类型:
# 自定义“小黑子”为一个异常对象
class XiaoHeiZi (Exception):
pass
# 定义一个接受文本的函数,如果接收到的文本是“jijiao”,则用关键字raise去拉起“小黑子”这个自定义异常
def iKUN(name):
if name == 'jijiao':
raise XiaoHeiZi()
try:
iKUN('jijiao')
except XiaoHeiZi:
print('你让我拿什么荔枝!!!')
traceback
当Python程序出现异常的时候通常会有一大串红色的报错,例如在执行下面这串代码
def level_3():
print ('进入 level_3')
a = [0]
b = a[1]
print ('离开 level_3')
def level_2():
print ('进入 level_2')
level_3()
print ('离开 level_2')
def level_1():
print ('进入 level_1')
level_2()
print ('离开 level_1')
level_1()
print('程序正常退出')
会得到如下报错:
进入 level_1
进入 level_2
进入 level_3
Traceback (most recent call last):
File "C:\Users\chx\AppData\Local\Programs\PyCharm Community\plugins\python-ce\helpers\pydev\pydevd.py", line 1534, in _exec
pydev_imports.execfile(file, globals, locals) # execute the script
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\chx\AppData\Local\Programs\PyCharm Community\plugins\python-ce\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
exec(compile(contents+"\n", file, 'exec'), glob, loc)
File "D:\programming\python\python_basic\error.py", line 47, in <module>
level_1()
File "D:\programming\python\python_basic\error.py", line 43, in level_1
level_2()
File "D:\programming\python\python_basic\error.py", line 38, in level_2
level_3()
File "D:\programming\python\python_basic\error.py", line 33, in level_3
b = a[1]
~^^^
IndexError: list index out of range
这里的报错有两个信息,一个是错误发生的位置在level_3函数内33行的b = a[1]
处,第二个信息就是说明了这行引起异常的代码, 是怎样被 一层层的调用进来的,也就是函数调用栈的信息。
而在使用了try-except处理异常后想看到该异常的调用栈信息,则需要用到traceback模块,使用方法如下:
import traceback
def level_3():
print ('进入 level_3')
a = [0]
b = a[1]
print ('离开 level_3')
def level_2():
print ('进入 level_2')
level_3()
print ('离开 level_2')
def level_1():
print ('进入 level_1')
level_2()
print ('离开 level_1')
try:
level_1()
except :
print(f'未知异常:{traceback.format_exc()}')
print('程序正常退出')
笔记源码摘自白月黑羽教程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步