У меня есть предложение 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
?