首页 > 解决方案 > Python引发异常,其中消息具有回车\ r控制字符

问题描述

我正在与电子设备进行串行通信,并且响应消息的结尾由回车符 ( \r) 指示。如果响应是乱码,我会提出一个自定义异常。我希望我的异常消息显示原始响应,其中可能包括回车。

我注意到回车会弄乱 Python 异常的打印/表示。

有没有办法让 Python 的异常使用类似的东西repr


潜在的解决方法

我可以创建一个自定义异常类并覆盖一些行为以替换\r"CR",但我不确定是否有更简单的方法。

我也不确定使用哪种 dunder 方法,也不确定在哪里可以找到使用哪种 dunder 方法。


我所看到的

输入:

class SerError(Exception):
    """Serial communications error."""


some_msg = f"some_serial\rmessage."
print(f"some_msg = {some_msg}.\nrepr(some_msg) = {repr(some_msg)}.")
raise SerError(some_msg)

输出:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
message..SerError: some_serial

您可以看到 Python\r通过将光标重置到行首来解释控制字符,并在此处打印消息的其余部分。

我不喜欢这种行为,因为它会覆盖我的异常消息,而不是打印原始消息。

标签: pythonexceptionreprcontrol-characters

解决方案


由于您正在定义自定义异常,因此您可以覆盖该__str__()方法以使其返回repr您想要的:

class SerError(Exception):
    """Serial communications error."""
    def __str__(self):
        return repr(self.args[0])

仅选择元组的self.args[0]第一个元素,否则它将返回repr具有一个或多个参数的元组的 。


推荐阅读