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('程序正常退出')

笔记源码摘自白月黑羽教程

posted @   excellentFish  阅读(43)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示