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

使用Rich为自定义异常添加格式失效问题求助

问题原因与解决方案

问题原因

  • 直接打印args[0]时,Rich会解析字符串里的[red][bold]格式标记,正常渲染样式。
  • 打印异常对象时,Rich使用专门的异常渲染逻辑,默认会把异常消息里的格式标记当成普通文本转义显示,不会解析执行。
  • foo=123能自动高亮是因为Rich的自动语法高亮功能,它会识别类似变量赋值的格式并自动给foo和123加亮,不管是字符串还是异常对象都会触发这个逻辑。

解决方案

给自定义异常实现__rich__方法,返回一个Rich可渲染对象(比如Text),让Rich打印异常时直接使用这个对象的渲染逻辑,就能保留格式了。

示例代码:

from rich.text import Text

class InvalidSpec(ValueError):
    def __init__(self, args):
        loc = args.find("=")
        hdr = "invalid spec: "
        # 构建带基础文本的Text对象
        self.display_text = Text(f"{hdr}{args}\n")
        # 追加带样式的空格和脱字符
        self.display_text.append(' ' * (len(hdr) + loc), style="red bold")
        self.display_text.append('^', style="red bold")
    
    def __rich__(self):
        # 返回自定义的可渲染内容
        return self.display_text

# 测试
from rich import print as rprint
rprint(InvalidSpec("foo=123"))

运行后打印异常对象,脱字符会正确显示为红色粗体,foo=123的自动高亮也会保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 20:13:10