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
相关产品推荐
相关产品推荐

