如何在 Python 中获取嵌套异常的消息值?

时间:2021-06-01 11:20:24

标签: python exception

我有一个看起来像这样的异常:

exc = ProtocolError('Connection Aborted', BadStatusLine('No status line received'))

如何访问 No status line received 部分?

以下是示例情况:

def some_function():
    raise ProtocolError('Connection Aborted', BadStatusLine('No status line received'))

def some_other_function():
    try:
        some_function()
    except Exception as exc:
        if exc.message:
            details = exc.message
        else:
            details = exc

在上面的代码中,我试图检查返回的异常是否有消息,如果有,我应该将其写入数据库,但是当我调用 exc.message 时,它返回一个空字符串,当我调用 exc 时,它返回:

<块引用>

bson.errors.InvalidDocument:无法编码对象: ProtocolError('Connection Aborted', BadStatusLine('No status linereceived',)),类型:

所以我不能将它写入数据库,因为它的类型是 Exception 而不是 string,我需要做的是查看返回的 Exception 中是否有另一个嵌套的 Exception 并获取它的消息。

1 个答案:

答案 0 :(得分:1)

我无法找到获取内部消息或异常的确切最佳方法,但为了快速帮助,我编写了一个实用程序函数,该函数通过使用正则表达式将返回内部异常或消息,完整代码如下

from urllib3.exceptions import ProtocolError
from http.client import BadStatusLine
import re

def FetchInnerExceptions(exc):
    result = []
    messages = str(exc).split(',')
    for msg in messages:
        m = re.search('''(?<=')\s*[^']+?\s*(?=')''', msg)
        if m is not None or m != '':
            result.append(m.group().strip())
    return result

def some_function():
    raise ProtocolError('Connection Aborted', BadStatusLine('No status line received'))

def some_other_function():
    try:
        some_function()
    except Exception as exc:
        e = FetchInnerExceptions(exc)
        print(e) #dumps all array or use index e[1] for your required message

some_other_function()