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

如何用Python unittest标准库检查函数是否抛出多个异常之一?

在unittest中测试函数是否抛出多个异常中的任意一个

方法1:传入异常类型元组(最简洁)

unittest.TestCase.assertRaises() 支持传入异常类型的元组,只要函数抛出元组中的任意一种异常,测试就会通过。你之前的写法错误是因为把第二个异常类型当成了调用参数(assertRaises的第二个位置参数是待调用的对象,而非第二个异常类型)。

修改你的测试用例如下:

from statistics import mean, StatisticsError
import unittest

def my_list_mean(lof):
    # return sum(lof) / len(lof)    # ZeroDivisionError
    return mean(lof)                # StatisticsError

class TestMultipleWaysToComputeMean(unittest.TestCase):
    def test_zero_division_or_statistics_error(self):
        # 传入异常类型的元组
        with self.assertRaises((ZeroDivisionError, StatisticsError)):
            my_list_mean([])

if __name__ == "__main__":
    unittest.main()

不管my_list_mean是哪种实现,只要抛出ZeroDivisionError或StatisticsError,这个测试都会通过。

方法2:手动捕获并验证异常类型(更灵活)

如果需要对异常做额外验证(比如检查异常消息),可以用try-except块手动捕获,然后判断异常类型是否在允许范围内:

class TestMultipleWaysToComputeMean(unittest.TestCase):
    def test_zero_division_or_statistics_error(self):
        allowed_exceptions = (ZeroDivisionError, StatisticsError)
        try:
            my_list_mean([])
        except allowed_exceptions:
            # 抛出了预期的异常,直接通过
            pass
        except Exception as e:
            # 抛出了非预期的异常,标记测试失败
            self.fail(f"意外抛出异常:{type(e).__name__}")
        else:
            # 没有抛出任何异常,标记测试失败
            self.fail("未抛出预期的异常")

这种方式适合需要自定义断言逻辑的场景,比如你想同时验证异常的具体信息。


内容的提问来源于stack exchange,提问作者Alexander L. Hayes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:37:32