程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何从 Traceback 中提取任何特定的错误消息?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何从 TraceBACk 中提取任何特定的错误消息??

开发过程中遇到如何从 TraceBACk 中提取任何特定的错误消息?的问题如何解决?下面主要结合日常开发的经验,给出你关于如何从 TraceBACk 中提取任何特定的错误消息?的解决方法建议,希望对你解决如何从 TraceBACk 中提取任何特定的错误消息?有所启发或帮助; @H_607_2@我想提取显示在最后一行的错误消息。我可以通过拆分来做到这一点。

test_str = """TraceBACk (most recent call last):
    file "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 59,in testPartExecutor
        yIEld
    file "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 593,in run
        self._callTestMethod(testMethod)
    file "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 550,in _callTestMethod
        method()
    file "/Users/abcd/efgh/ijkl/bin/../tests/abd/dummy/dummy1.py",line 95,in test_abc
        assert false,"FAIliNG FOR A REASON"
    AssertionError: FAIliNG FOR A REASON """
    
    last_line = test_str.split("\n")[-1]
    print(last_line.split(":")[-1])
@H_607_2@如何使用正则表达式实现相同的效果? 它可以包含任何类型的错误,AssertionError,AttributeError,TypeError,SyntaxError 等。

解决方法

@H_607_2@你为什么需要一个正则表达式?它在这里没有任何价值。

print(re.split(":",last_line,1)[-1])
@H_607_2@也许更有用一些,

@H_548_5@matched = re.match(r'^\s*([^:\s]+):(.*)',last_linE)
if matched:
    error,message = matched.groups()
@H_607_2@\s 匹配任何空白字符,* 表示重复零次或多次; [^:\s] 匹配任何不是空格或冒号的字符,我们在第一个冒号之前重复这个。

@H_607_2@用稍微高级一点的术语来说,这会在第一段非空格(和非冒号)字符之后找到一个包含冒号的行,并将冒号之前的标记及其之后的所有内容提取为两个单独的组。 (第二组也将包含冒号后的任何空格;可以在左括号前添加 \s* 以修剪任何前导空格。)

@H_607_2@但同样,如果您可以在没有正则表达式的情况下执行此操作,请执行此操作;使用一个只会让这变得更慢和更复杂。

@H_607_2@如果您想从一段较长的文本中提取回溯,请尝试

re.match(r''''^TraceBACk \(most recent call last\):
(?: File "[^\n]+",line \d+,in [^\n]+
  [\n]+
)*([^:]+):([^\n]+)''',many_lines,re.MULTILINE)
@H_607_2@但这是未经测试的,可能需要一些修改才能处理与您共享的示例不同的示例(特别是,不在文件中的代码中的错误看起来略有不同;但我也注意到您的示例回溯看起来不像标准的,因为间距模式略有不同 - 此正则表达式针对标准格式)。

@H_607_2@也许注意到我们如何使用一个 '''...''' 三引号字符串将文字换行符嵌入到正则表达式中;我们仍然使用 r 符号将其标记为原始字符串,这样我们就不必将所有反斜杠加倍。

@H_607_2@re.MULTILINE 标志是一个修饰符,它改变了 ^ 锚的含义;有标志,它匹配任何行的开头(而没有标志,它只匹配输入字符串的开头)。

, @H_607_2@您可以匹配第一行,然后是所有不以 TraceBACk 或以 Error 结尾的单词开头的行,以防止过度匹配。

^TraceBACk \(most recent call last\):(?:\r?\n(?![^\S\r\n]*(?:TraceBACk|\w*Error)\b).*)*\r?\n[^\S\r\n]*(\w*Error:.*)
    @H_673_68@ ^ 字符串开头 @H_673_68@ TraceBACk \(most recent call last\): 匹配 TraceBACk (most recent call last): @H_673_68@ (?: 非捕获组
      @H_673_68@ \r?\n 匹配换行符 @H_673_68@ (?![^\S\r\n]*(?:TraceBACk|\w*Error)\b) 断言该行不以 TraceBACk 开头或以 Error 结尾的单词 @H_673_68@ .* 匹配整行
    @H_673_68@ )* 关闭非捕获组并重复 0 次以上 @H_673_68@ \r?\n[^\S\r\n]* 匹配换行符,可选的空白字符不带换行符 @H_673_68@ (\w*Error:.*) 捕获组 1,匹配可选单词字符和 Error: 后跟该行的其余部分
@H_607_2@Regex demo

@H_607_2@例如:

import re

test_str = """TraceBACk (most recent call last):
    File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 59,in testPartExecutor
        yield
    File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 593,in run
        self._callTestMethod(testMethod)
    File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py",line 550,in _callTestMethod
        method()
    File "/Users/abcd/efgh/ijkl/bin/../tests/abd/dummy/dummy1.py",line 95,in test_abc
        assert false,"FAILING FOR A REASON"
    AssertionError: FAILING FOR A REASON """

pattern = r"^TraceBACk \(most recent call last\):(?:\r?\n(?![^\S\r\n]*(?:TraceBACk|\w*Error)\b).*)*\r?\n[^\S\r\n]*(\w*Error:.*)"

match = re.match(pattern,test_str)

if match:
    print(match.group(1))
@H_607_2@输出

['AssertionError: FAILING FOR A REASON ']
@H_607_2@Python demo

,
import re

test_str = """TraceBACk (most recent call last):
    File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/unittest/case.py","FAILING FOR A REASON"
    AssertionError: FAILING FOR A REASON """


match = re.search(r'(?<=Error:.)(.*)(?=.$)',test_str)
print(match.group(1))
# FAILING FOR A REASON

大佬总结

以上是大佬教程为你收集整理的如何从 Traceback 中提取任何特定的错误消息?全部内容,希望文章能够帮你解决如何从 Traceback 中提取任何特定的错误消息?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。