有没有办法在测试期间“捕获”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个版本,所以如果他们之间存在差异,我会很感激一些例子。
答案 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))