python获取异常信息exc_info和print_exc

1 python获取异常信息exc_info和print_exc

python通过sys.exc_info获取异常信息,通过traceback.print_exc打印堆栈信息,包括错误类型和错误位置等信息。

1.1 异常不一定是错误

所有错误都是异常,但并非所有异常都是错误。比如,有些异常表示警告(参考warnings模块),有些异常是功能信号(比如,input函数从标准输入流sys.stdin读取输入)。

用法

while True:
    try:
        ins=input('请输入:')
    except EOFError as e:
        # except 代码块
        break
    else:
        print('你输入的是:',ins)

描述

(1) 通过input循环获取用户输入;

(2) 通过EOFError 作为功能信号,触发则退出输入;

(3) 通过Ctrl+D(windows)或Ctrl+Z(Unix)触发EOFError 异常;

示例

>>> import traceback
>>> while True:
    try:
        ins=input('请输入:')
    except EOFError as e:
        # 通过 Ctrl+D 或 Ctrl+Z 触发 EOFError
        print('遇到 Ctrl+D 或 Ctrl+Z,退出输入')
        print(traceback.print_exc())
        break
    else:
        print('你输入的是:',ins)

请输入:梯阅线条
你输入的是: 梯阅线条
请输入:
遇到 Ctrl+D 或 Ctrl+Z,退出输入
Traceback (most recent call last):
  File "", line 3, in <module>
EOFError: EOF when reading a line
None

1.2 异常条件语句和raise

python自定义异常也可用于触发非错误的情况,根据条件语句触发raise异常。

用法

class FoundByExc(Exception):pass
def search_by_exc(strlist,target):
    if True:
        raise FoundByExc("xxx")
    else:
        return "xxx"

描述

搜索指定内容时触发异常。

(1) 自定义一个异常类;

(2) 条件成立,触发异常;

示例

>>> class FoundByExc(Exception):pass

>>> def search_by_exc(strlist,target):
    for s in strlist:
        if s == target:
            raise FoundByExc("在{}找到'{}'".format(strlist,target))
        else:
            return "在{}未找到'{}'".format(strlist,target)

        
>>> def test_searchbyexc(strlist,target):
    try:
        sbe=search_by_exc(strlist,target)
    except FoundByExc as fbe:
        print(fbe)
    else:
        print(sbe)

>>> strlist=['梯阅线条','tyxt.work','9555']
>>> target1='梯阅线条';target2='tyxt'
>>> test_searchbyexc(strlist,target1)['梯阅线条', 'tyxt.work', '9555']找到'梯阅线条'
>>> test_searchbyexc(strlist,target2)['梯阅线条', 'tyxt.work', '9555']未找到'tyxt'

1.3 sys.exc_info获取异常信息

python中空的except捕获任何未被捕获的异常,通过sys.exc_info获取捕获的实际异常。

用法

import sys
sys.exc_info()

描述

返回元组(type,value,traceback),

type:捕获的异常类型;

value:捕获的异常类的实例;

traceback:触发异常的调用堆栈;

示例

>>> try:
    1+[]
except:
    print(sys.exc_info())

    
(<class 'TypeError'>, TypeError("unsupported operand type(s) for +: 'int' and 'list'"), <traceback object at 0x03EFEE40>)

1.4 traceback.print_exc打印异常堆栈

用法

import traceback
try:
    # try 代码块
except xxx:
    # except 代码块
    traceback.print_exc()

描述

当Python程序发生异常时,通过traceback.print_exc()获取异常的详细信息,包括异常类型、异常值和异常发生的位置信息。

(1) 导入 traceback模块;

(2) 在except处理器,调用traceback.print_exc()方法;

示例

>>> import traceback
>>> try:
    1+[]
except:
    traceback.print_exc()

    
Traceback (most recent call last):
  File "", line 2, in <module>
TypeError: unsupported operand type(s) for +: 'int' and 'list'

你可能感兴趣的:(python,python)