Должен ли я использовать встроенное исключение или определить свое собственное?

У меня есть метод или функция, как:

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, Код, по которому вы его поймаете, даст более полное представление о том, в чем заключается проблема и как с ней бороться.

Другие вопросы по тегам