Python повышение исключения, когда в сообщении указан символ возврата каретки \ r - PullRequest
1 голос
/ 23 марта 2020

Я выполняю последовательную связь с электронным устройством c, и конец ответного сообщения определяется возвратом каретки (\r). Если ответ искажен, я поднимаю пользовательское исключение. Я хотел бы, чтобы в моем сообщении об исключении отображался необработанный ответ, который может включать в себя возврат каретки.

Я заметил, что каретка возвращает своего рода ошибки, выводящие на печать / представление исключений Python.

Есть ли способ, чтобы исключения Python использовали что-то вроде repr?


Потенциальный обходной путь

Я мог бы создать собственный класс исключений и переопределить некоторое поведение, чтобы заменить \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 путем сброса курсора в начало строки, где он печатает остаток сообщения.

Мне не нравится это поведение, поскольку оно перезаписывает мое исключение сообщение, в отличие от печати исходного сообщения.

1 Ответ

1 голос
/ 23 марта 2020

Поскольку вы определяете пользовательское исключение, вы можете переопределить метод __str__(), чтобы он возвращал желаемый repr:

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

self.args[0] выбирает только первый элемент кортеж, в противном случае он вернет repr кортежа с одним или несколькими аргументами.

...