Должен ли я использовать встроенное исключение или определить свое собственное?
У меня есть метод или функция, как:
findSomething(v)
Целесообразно вызывать KeyError в случае, если я ничего не нахожу или лучше определить мое собственное исключение? Как вы думаете?
Я знаю, это не чисто технический вопрос, но они сказали: "Читаемость имеет значение", и мне нужно знать, что думают другие.:)
3 ответа
Если природа ошибки является сложной, и ее использование также повторяется в других местах вашего кода, я бы определил пользовательскую ошибку.
Просто потому, что это более читабельно, чтобы написать:
raise MyError('reason for MyError')
чем:
raise ValueError('the is an Error of type MyError, and here is the reason...')
Но если это не повторяемая часть вашего кода и ошибка очевидна, я бы использовал ValueError (до KeyError).
Ну, я думаю, читабельность больше связана с тем, как вы кодируете, говорите, как вы называете переменные, функции и т. Д., Как вы структурируете свой код и комментируете его.
Но, что касается вопроса об обработке исключений, который у вас есть: вот что, я думаю, вы должны рассмотреть:
1- Если функция получает действительный ввод и не находит ничего, вы не должны бросать или определять исключение. Вам просто нужно вернуть значение, которое означает, что вы ничего не нашли, и / или просто напечатать правильное сообщение.
2- Если входной параметр v недействителен в зависимости от того, является ли он объектом, созданным в классе или просто примитивным типом, вы можете определить для него правильное исключение или просто перехватить встроенное исключение, соответственно.
Может быть закрыт как основанный на мнении, но.
Я предпочитаю ограничивать KeyError
, ValueError
и т.д. в локальной области видимости, т.е. не больше, чем внутри 1 функции, предпочтительно внутри логического блока.
Допустим, вы поймали KeyError в паре слоев от исходного места, где произошло исключение. Это не дает вам никакой информации и могло произойти где угодно. Функция, вызывающая другую, не должна знать о деталях реализации вызываемого. Также вы не пишете код для проверки трассировки стека исключений и используете его в логике кода, не так ли?
Определение пользовательского исключения дает вам возможность описать местоположение и высокоуровневое объяснение такой проблемы, как UserNotFound
или же NoMatchingChannel
, Код, по которому вы его поймаете, даст более полное представление о том, в чем заключается проблема и как с ней бороться.