Python:try except 异常处理整理

目录

一、try except异常处理的语句格式

二、获取相关异常信息

(1)sys.exec_info()

三、traceback模块的常用方式

(1)traceback.print_tb(tb, limit=None, file=None) 打印指定堆栈异常信息

 (2)traceback.print_exception(exc, /, [value, tb, ]limit=None, file=None, chain=True) 和 traceback.print_exc(limit=None, file=None, chain=True) 打印指定堆栈异常信息

 (3)traceback.format_list(extracted_list) 和 traceback.format_exception(exc, /, [value, tb, ]limit=None, chain=True)  返回可打印的错误信息字符串列表

 (4)和 traceback.format_exc(limit=None, chain=True)  返回错误信息字符串


一、try except异常处理的语句格式

try:
    可能产生异常的代码块
except [ (Error1, Error2, ... ) [as e] ]:
    处理异常的代码块1
except [ (Error3, Error4, ... ) [as e] ]:
    处理异常的代码块2
except  [Exception]:
    处理其它异常
finally:
    最后做其他事情,finally必定执行

二、获取相关异常信息

(1)sys.exec_info()

sys.exc_info() 该函数会返回一个元组(type(e), e, e.__traceback__)。该元组记录错误类型、错误信息、错误信息所在堆栈。如果没有异常发生,则会返回一个空的元组

示例:

import sys
import traceback

def func(a: int, b: int):
    return a // b

def func1(a: int, b: int):
    try:
        return func(a, b)

    except Exception as e:
        errType, errInfo, errTraceBack = sys.exc_info()
        print(errType)         # <class 'ZeroDivisionError'>
        print(errInfo)         # integer division or modulo by zero
        print(errTraceBack)    # <traceback object at 0x000001FEF8C7BB80>

if __name__ == "__main__":
    func1(1, 0)

三、traceback模块的常用方式

相关官方文档:traceback —— 打印或读取堆栈的跟踪信息 — Python 3.11.2 文档

(1)traceback.print_tb(tblimit=Nonefile=None) 打印指定堆栈异常信息

  • traceback.print_tb(tblimit=Nonefile=None) 其中tb指的是从sys.exc_info()获取的traceback堆栈类型,limit指的是报告错误的堆栈层数,file指的是输出到哪个文件流中,默认为stderr
import sys
import traceback

def func(a: int, b: int):
    return a // b

def func1(a: int, b: int):
    try:
        return func(a, b)

    except Exception as e:
        errType, errInfo, errTraceBack = sys.exc_info()
        traceback.print_tb(errTraceBack) 
'''
  File "d:\Python WorkSpace\GameAssist\test2.py", line 10, in func1
    return func(a, b)
  File "d:\Python WorkSpace\GameAssist\test2.py", line 6, in func
    return a // b
'''

if __name__ == "__main__":
    func1(1, 0)

 (2)traceback.print_exception(exc/, [valuetb, ]limit=Nonefile=Nonechain=True) 和 traceback.print_exc(limit=Nonefile=Nonechain=True) 打印指定堆栈异常信息

  • traceback.print_exception(exc/, [valuetb, ]limit=Nonefile=Nonechain=True) 打印回溯对象 tb 到 file 的异常信息和整个堆栈回溯。
  • traceback.print_exc(limit=Nonefile=Nonechain=True) 相当于print_exception(*sys.exc_info(), limit, file, chain) 的简写
import sys
import traceback

def func(a: int, b: int):
    return a // b

def func1(a: int, b: int):
    try:
        return func(a, b)

    except Exception as e:
        traceback.print_exception(e)
        traceback.print_exception(e, file=open("./ErrorLog.txt", "a+"))
'''
Traceback (most recent call last):
  File "d:\Python WorkSpace\GameAssist\test2.py", line 9, in func1
    return func(a, b)
  File "d:\Python WorkSpace\GameAssist\test2.py", line 5, in func
    return a // b
ZeroDivisionError: integer division or modulo by zero
'''
if __name__ == "__main__":
    func1(1, 0)

 (3)traceback.format_list(extracted_list) 和 traceback.format_exception(exc/, [valuetb, ]limit=Nonechain=True)  返回可打印的错误信息字符串列表

import sys
import traceback

def func(a: int, b: int):
    return a // b

def func1(a: int, b: int):
    try:
        return func(a, b)

    except Exception as e:
        errType, errInfo, errTraceBack = sys.exc_info()
        print(traceback.format_list(traceback.extract_tb(errTraceBack)))
'''
['  File "d:\\Python WorkSpace\\GameAssist\\test2.py", line 9, in func1\n    return func(a, b)\n', '  File "d:\\Python WorkSpace\\GameAssist\\test2.py", line 5, in func\n    return a // b\n']
'''

if __name__ == "__main__":
    func1(1, 0)

  •  traceback.format_exception(exc/, [valuetb, ]limit=Nonechain=True)  格式化一个栈跟踪和异常信息。 参数的含义与传给 print_exception() 的相应参数相同。 返回值是一个字符串列表,每个字符串都以一个换行符结束且有些还包含内部换行符。
import sys
import traceback

def func(a: int, b: int):
    return a // b

def func1(a: int, b: int):
    try:
        return func(a, b)
    except Exception as e:
        print(traceback.format_exception(e))

'''
['Traceback (most recent call last):\n', '  File "d:\\Python WorkSpace\\GameAssist\\test2.py", line 9, in func1\n    return func(a, b)\n', '  File "d:\\Python WorkSpace\\GameAssist\\test2.py", line 5, in func\n    return a // b\n', 'ZeroDivisionError: integer division or modulo by zero\n']
'''

if __name__ == "__main__":
    func1(1, 0)

 (4)和 traceback.format_exc(limit=Nonechain=True)  返回错误信息字符串

  • traceback.format_exc(limit=Nonechain=True) 这类似于 print_exc(limit) 但会返回一个字符串而不是打印到一个文件
import sys
import traceback

def func(a: int, b: int):
    return a // b

def func1(a: int, b: int):
    try:
        return func(a, b)
    except Exception as e:
        print(traceback.format_exc())

'''
Traceback (most recent call last):
  File "d:\Python WorkSpace\GameAssist\test2.py", line 9, in func1
    return func(a, b)
  File "d:\Python WorkSpace\GameAssist\test2.py", line 5, in func
    return a // b
ZeroDivisionError: integer division or modulo by zero
'''

if __name__ == "__main__":
    func1(1, 0)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃鱼的猫丿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值