Python 在消息有回车符的地方引发异常 return \r 控制字符

Python raising exception where message has carriage return \r control character

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

我注意到 returns 有点把 Python 的异常 printing/representation 弄乱了。

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


可能的解决方法

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

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


我看到了什么

输入:

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,并在此处打印消息的其余部分。

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

由于您正在定义自定义异常,因此您可以重写 __str__() 方法以使其 return 您想要的 repr

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

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