You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 03:01:00