如何在unittest中用assertRaises测试被try-except捕获的异常?
解决方法
你的问题核心是myfunction内部已经捕获了MyException并完成处理,没有将异常向外抛出,所以测试用例里的assertRaises自然检测不到。给你几个可行的处理方案:
方案1:处理完后重新抛出异常
如果业务允许函数向外暴露这个异常,在执行完清理逻辑后重新抛出原异常即可,这样测试用例就能正常捕获到:
def myfunction(): try: do_stuff() (...) raise MyException("...") except MyException as exception: do_clean_up(exception) raise # 重新抛出异常,保留原始栈信息
方案2:测试清理逻辑而非异常抛出
如果业务上myfunction不应该向外抛出这个异常,那你的测试方向需要调整——应该验证异常触发后清理逻辑是否被正确执行。可以用mock实现:
from unittest.mock import patch def test_clean_up_triggered(self): with patch('你的模块名.do_clean_up') as mock_clean: myfunction() # 验证清理函数被调用了一次 mock_clean.assert_called_once() # 验证传入的参数是MyException实例 self.assertIsInstance(mock_clean.call_args[0][0], MyException)
方案3:拆分函数逻辑
把抛出异常的核心逻辑拆成独立函数,这样可以单独测试这个函数是否会抛出异常,而myfunction只负责异常处理:
# 拆分出的逻辑函数 def core_logic(): do_stuff() (...) raise MyException("...") def myfunction(): try: core_logic() except MyException as exception: do_clean_up(exception)
测试时直接针对拆分后的函数:
def test_core_logic_raise(self): with self.assertRaises(MyException): core_logic()
内容的提问来源于stack exchange,提问作者Just Me
相关产品推荐
相关产品推荐

