У меня есть дочерний класс, который использует Python 3.6+ __set_name__
, чтобы гарантировать, что классы-владельцы аннотировали тип поля, несущего дочерний класс. Если у них нет исключения, вызывается.
Однако любое возникшее исключение всегда перехватывается Python, а вместо него вызывается RuntimeError
.
Например:
class Child:
def __set_name__(self, owner, name):
raise Exception("OOPS!")
class Owner():
child = Child()
Результаты в:
Traceback (most recent call last):
File "<stdin>", line 3, in __set_name__
Exception: OOPS!
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
RuntimeError: Error calling __set_name__ on 'Child' instance 'child' in 'Owner'
Это вполне может быть ожидаемым поведением (не удается найти конкретную c ссылку на __set_name__
исключения), но, возможно, также предполагает, что ожидается, что __set_name__
никогда не страдает исключением.
Поведение, которое я вижу, не является проблемой, если исключение происходит при правильных условиях. Однако это сложно протестировать, поскольку я не могу быть уверен, что возникшее исключение - это то, что вызвал мой код.
Есть ли лучший способ вызвать исключение, которое поддается тестированию, или действительно простой способ проверить исключение, заключенное в RuntimeError
, действительно ли тот, который был вызван моим кодом?