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

Python 测试期间从sys.exit()捕获错误消息,python,python-2.7,python-3.3,Python,Python 2.7,Python 3.3,是否有办法在测试期间“捕获”sys.exit()打印的错误消息,并将其与另一个字符串进行比较 一些背景:在我正在编写的Python脚本中,我一直在使用sys.exit()打印更具体的错误消息(并避免通常出现的回溯) 其他时候,我只使用常规消息(尤其是ConfigParser): 我想在那里捕获错误消息,并可能使用断言(err,'我的预期错误消息')进行比较 我正在使用的脚本有Python2和Python3两个版本,因此如果它们之间在执行此操作方面存在差异,我希望有一些示例。assertEqual

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

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

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

我想在那里捕获错误消息,并可能使用
断言(err,'我的预期错误消息')
进行比较


我正在使用的脚本有Python2和Python3两个版本,因此如果它们之间在执行此操作方面存在差异,我希望有一些示例。

assertEqual
是unittest的测试用例的一部分,因此如果您不使用它,它对您没有帮助。你将不得不放弃这个过程,看看会发生什么。为什么不编写一些单元测试呢?

不做任何其他操作,然后引发
SystemExit
,您可以像捕获任何其他异常一样捕获它

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

在SystemExit的情况下,如下所示:

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

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

查看
回溯中的示例和提供的退出块


我试图编写单元测试。:)我需要做的是获取由
sys.exit('my error message')
生成的错误消息,并使用
assertEqual
测试该错误消息是否确实打印出来。我想第一句话说得很清楚。谢谢你的解释。这给了我所需要的线索。我现在不接受这一点——如果可能的话,我希望看到其他建议。如果几天后没有其他问题出现,我会再次接受。虽然这段代码可能会回答这个问题,但提供关于如何和/或为什么解决问题的附加上下文将提高答案的长期价值。
except ConfigParser.NoSectionError as err:
    sys.exit(err)
with self.assertRaises(SystemExit) as cm:
    sys.exit('some message')

self.assertEqual(cm.exception.args[0], 'some message')
...
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))