Если ваш код требует определенного интерфейса, и пользователь пропускает объект без этого интерфейса, то девять раз из десяти неуместно ловить исключение. В большинстве случаев AttributeError
не только разумен, но и ожидаем, когда речь идет о несоответствиях интерфейса.
Иногда может быть целесообразно поймать AttributeError
по одной из двух причин. Либо вы хотите, чтобы какой-то аспект интерфейса был необязательный , либо вы хотите выдать более конкретное исключение, возможно, подкласс исключений для конкретного пакета. Конечно, вы никогда не должны препятствовать созданию исключения, если вы честно не обработали ошибку и любые последующие действия.
Так что мне кажется, что ответ на этот вопрос должен быть специфичным для проблемы и предметной области. По сути, это вопрос того, должно ли работать Cow
объект вместо Duck
. Если это так, и вы справляетесь с любым необходимым интерфейсом, то это нормально. С другой стороны, нет никакой причины явно проверять, передал ли кто-то вам объект Frog
, если только это не вызовет катастрофический сбой (то есть что-то намного хуже, чем трассировка стека).
Тем не менее, это всегда хорошая идея, чтобы документировать ваш интерфейс - для этого предназначены строки документации (среди прочего). Когда вы думаете об этом, гораздо эффективнее выдавать общую ошибку в большинстве случаев и сообщать пользователям правильный способ сделать это в строке документации, чем пытаться предвидеть каждую возможную ошибку, которую может сделать пользователь, и создавать собственное сообщение об ошибке.
Последнее предупреждение - возможно, вы думаете о UI здесь - я думаю, что это другая история. Хорошо проверить входные данные, которые дает вам конечный пользователь, чтобы убедиться, что он не является вредоносным или ужасно искаженным, и предоставить полезную обратную связь вместо трассировки стека. Но для библиотек или подобных вещей вы действительно должны доверять программисту, использующему ваш код, чтобы использовать его разумно и уважительно, и понимать ошибки, которые генерирует Python.