Изменение сообщения об исключении без потери стека от повышения - PullRequest
0 голосов
/ 09 января 2019

У меня есть предложение try/except, которое будет либо возвращать, либо перехватывать KeyError следующим образом:

try:
    return super().__new__(globals()[kls])
except KeyError:
    raise

При неправильном использовании генерируется трассировка стека, например:

>>> g = Grid(cell='Circle')
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    g = Grid(cell='Circle')
  File "<pyshell#1>", line 8, in __new__
    return super().__new__(globals()[kls])
KeyError: 'SHPCircleGrid'
>>> g
Traceback (most recent call last):
  File "<pyshell#17>", line 1, in <module>
    g
NameError: name 'g' is not defined

И это прекрасно, однако я хочу «расширить / изменить» сообщение, чтобы объяснить пользователю, как избежать этой ошибки снова; то есть перейти от:

KeyError: 'SHPCircleGrid'

до

KeyError: 'SHPCircleGrid'. Use 'Hex', 'Rect' or 'Tri' for cell keyword.

При сохранении стека для пользователя. Общий print() в захватывающей части устанавливает g в NoneType, что мне не нравится, поэтому простая печать не способ справиться с этим. При добавлении другого raise KeyError('some message') печатаются два стека (сообщение «при обработке исключения другое ...»), что также нежелательно.

Каков подходящий способ справиться с этим, чтобы его можно было распространить на любые дополнительные ключевые слова, для которых экземпляр класса может выбросить KeyError?

1 Ответ

0 голосов
/ 09 января 2019

Разве вы не можете просто достичь этого, передав сообщение KeyError как таковое:

try:
    return super().__new__(globals()[kls])
except KeyError as e:
    key = "'{}'".format(*e.args)
    base = "{}. Use 'Hex', 'Rect' or 'Tri' for cell keyword."
    raise KeyError(base.format(key)) from None
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...