我有一个看起来像这样的异常:
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 并获取它的消息。
答案 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()