4

有没有办法“捕获”sys.exit()在测试期间打印出的错误消息并将其与另一个字符串进行比较?

一些背景知识:在我正在处理的 Python 脚本中,我一直在使用sys.exit()打印出更具体的错误消息(并避免通常出现的回溯)。

try:
    do_something()
except IOError:
    sys.exit('my error message')

其他时候,我只使用常规消息(尤其是使用 ConfigParser):

except ConfigParser.NoSectionError as err:
    sys.exit(err)

我想在那里捕获错误消息,并可能使用 anassertIs(err, 'my intended error message')进行比较。

我正在处理的脚本同时具有 Python 2 和 3 版本,因此如果它们之间存在差异,我将不胜感激。

4

3 回答 3

3

sys.exit不做任何事情然后 raise SystemExit,你可以像任何其他异常一样捕获它。

有关上下文管理器的示例只是向您展示了如何使用它来获取在 with 块中引发的异常,如果您需要对其执行检查。

在 SystemExit 的情况下,它看起来像这样:

with self.assertRaises(SystemExit) as cm:
    sys.exit('some message')

self.assertEqual(cm.exception.args[0], 'some message')
...
于 2013-06-24T14:08:56.577 回答
0

assertEqual是 unittest 的 TestCase 的一部分,所以如果你不使用它就帮不了你。您将不得不关闭该过程以查看会发生什么。为什么不写一些单元测试呢?

于 2013-06-24T14:05:01.013 回答
0

查看中的示例traceback和提供的退出块。

https://docs.python.org/3/library/traceback.html

Python 3.6.6 |Anaconda custom (64-bit)| (default, Jun 28 2018, 11:27:44) [MSC v.1900 64 bit (AMD64)]

import traceback


if __name__ == '__main__':
    try:
        main()
    except Exception as e:
        with open('death.log', 'w') as fh:
            big_stack = '\n'.join(traceback.format_stack())
            print(big_stack)
            print(repr(e))
            fh.write(big_stack)
            fh.write(repr(e))
于 2018-09-07T02:32:37.660 回答