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

如何为接收异常类作为参数的函数添加类型提示?

解决异常类参数的类型提示问题

你的def catch_exception(exception: Type[Exception])写法本身符合PEP 484规范,完全可以正常使用。如果想要更精准或更具文档性的类型提示,还有以下几种方案可选:

1. 使用TypeVar实现泛型类型提示

如果希望函数能接收Exception的任意子类,同时保留具体的异常类型信息(让IDE和类型检查工具识别传入的具体类),可以用TypeVar定义泛型:

from typing import Type, TypeVar

# 限定为Exception子类的TypeVar
ExcType = TypeVar("ExcType", bound=Exception)

def catch_exception(exception: Type[ExcType]) -> None:
    try:
        1/0
    except exception:
        print("lol")

这种写法既保证了类型安全(只能传入Exception子类),又能让类型检查工具明确识别传入的具体异常类,兼顾灵活性和类型精准性。

2. 限定为具体异常类的联合类型

如果函数只需要处理特定的几种异常类(比如仅支持ZeroDivisionError、ValueError),可以直接用Union明确列出:

from typing import Type, Union

def catch_exception(exception: Union[Type[ZeroDivisionError], Type[ValueError]]) -> None:
    try:
        1/0
    except exception:
        print("lol")

这种写法的文档性最强,调用者一眼就能知道函数支持的异常范围,同时IDE会严格校验传入参数是否符合要求。

3. 用BaseException代替Exception(按需选择)

如果需要捕获所有异常类型(包括KeyboardInterrupt、SystemExit这类不属于Exception子类的系统级异常),可以将类型提示改为:

from typing import Type

def catch_exception(exception: Type[BaseException]) -> None:
    try:
        1/0
    except exception:
        print("lol")

注意:通常不建议捕获所有BaseException类型,仅适用于明确需要处理系统级异常的场景。

总结

  • 最通用且规范的写法是Type[Exception],适配大多数常规场景;
  • 泛型TypeVar写法适合需要保留具体异常类型信息的场景;
  • 联合类型写法适合函数仅处理特定异常的场景,文档性最优。

内容的提问来源于stack exchange,提问作者edd313

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 08:36:02