Должен ли я использовать встроенное исключение или определить свое собственное? - PullRequest
0 голосов
/ 17 сентября 2018

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

findSomething(v)

Подходит ли для вызова KeyError в случае, если я ничего не нахожу или лучше определить мое собственное исключение?Что вы думаете?

Я знаю, это не чисто технический вопрос, но они сказали: «Читаемость имеет значение», и мне нужно знать, что думают другие.:)

Ответы [ 3 ]

0 голосов
/ 17 сентября 2018

Может быть закрыт как основанный на мнении, но.

Я предпочитаю ограничить KeyError, ValueError и т. Д. Локальной областью, т. Е. Не больше, чем внутри 1 функции, желательно внутри логического блока.

Допустим, вы поймали KeyError в паре слоев от исходного места, где произошло исключение.Это не дает вам никакой информации и могло произойти где угодно.Функция, вызывающая другую, не должна знать о деталях реализации вызываемого.Также вы не пишете код для проверки трассировки стека исключений и используете его в логике кода, не так ли?

Определение пользовательского исключения дает вам возможность описать местоположение и высокоуровневое объяснение проблемы, например UserNotFound или NoMatchingChannel.Код, по которому вы его поймаете, поможет лучше понять, в чем заключается проблема и как с ней бороться.

0 голосов
/ 17 сентября 2018

Ну, я думаю, читабельность больше связана с тем, как вы кодируете, как вы называете переменные, функции и т. Д., Как вы структурируете свой код и комментируете его.

Но, что касается вопроса об обработке исключений, который у вас есть: я думаю, вам следует рассмотреть следующие вопросы:

1 - Если функция получает действительный ввод и не находит ничего, что вы не должны 'бросить или определить исключение.Вам просто нужно вернуть значение, которое представляет, что вы ничего не нашли, и / или просто напечатать правильное сообщение.

2- Если входной параметр v недействителен, зависит от того, является ли он объектом, созданным изclass или просто примитивный тип, вы можете определить для него правильное исключение или просто перехватить встроенное исключение, соответственно.

0 голосов
/ 17 сентября 2018

Если природа ошибки сложна, и ее использование также повторяется в других местах вашего кода, я бы определил пользовательскую ошибку.

Просто потому, что она более читабельна для записи:

raise MyError('reason for MyError')

Than:

raise ValueError('the is an Error of type MyError, and here is the reason...')

Но если это не повторяемая часть вашего кода и ошибка ясна, я бы использовал ValueError (до KeyError).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...