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

Python自定义异常如何在__init__中处理三引号字符串前导空格

问题根因

  • 构造方法名称错误:你定义的___init___前后各有3个下划线,不符合Python构造方法__init__(前后各2个下划线)的命名规范,自定义构造逻辑完全没有执行,使用的是父类Exception的默认构造,只会存储原始传入的消息。
  • clean方法未声明为静态方法:实例调用实例方法时默认会传入self作为第一个参数,你当前的clean方法仅定义了message一个入参,实际运行会抛出参数数量不匹配的异常。
  • 未同步父类内置属性:Exception类做字符串转换、打印时默认读取构造时传入的args元组内容,你自定义的self.message属性不会被默认逻辑识别,哪怕构造逻辑执行成功,直接取异常内容依然会返回原始值。

修正后实现

class ScriptError(Exception):
    """自定义异常类,用于弹窗友好展示多行错误信息"""
    def __init__(self, message):
        cleaned_msg = self.clean(message)
        # 将清洗后的消息传入父类构造,保证父类内置逻辑读取的是修正后内容
        super().__init__(cleaned_msg)
        self.message = cleaned_msg

    @staticmethod
    def clean(message):
        """清除多行字符串每行的前导空白"""
        return '\n'.join([line.lstrip() for line in str(message).split('\n')])

    def __str__(self):
        return self.message

效果验证

你原来的使用方式完全不需要修改:

if not any([status.getCurrentUser() in groups[group] for group in groups]):
    raise ScriptError("""You do not have permission to continue.
                         You must be in one of the following permitted groups:
                         {}""".format(config['permitted_groups']))

捕获异常后不管是打印异常对象、调用str(e)还是读取e.message,拿到的都是已经清除前导空格的格式化内容,不会出现弹窗格式错乱的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 18:45:04