在测试期间从sys.exit()捕获错误消息

时间:2013-06-24 13:34:53

标签: python python-2.7 python-3.3

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

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

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

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

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

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

我正在处理的脚本同时包含Python 2& 3个版本,所以如果他们之间存在差异,我会很感激一些例子。

3 个答案:

答案 0 :(得分:3)

sys.exit除了提出SystemExit之外,别做其他事情,你可以像其他任何例外一样抓住它。

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

在SystemExit的情况下,这将是这样的:

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

self.assertEqual(cm.exception.args[0], 'some message')
...

答案 1 :(得分:0)

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

答案 2 :(得分: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))