Коли я повинен підкласировать виняток у Python?


10

У моєму коді є близько семи місць, де я піднімаю виняток. Усі ці винятки трактуються однаково: надрукуйте помилку в журналі, поверніть стан програмного забезпечення за замовчуванням та вийдіть.

Під час огляду коду мій старший інженер, якого я дуже ціную, сказав, що я повинен підкласифікувати всі ці винятки. Його аргумент полягає в тому, що в майбутньому ми, можливо, захочемо по-різному обробляти винятки, і це буде простіше.

Мій аргумент полягає в тому, що в даний час він лише захаращує наш код і, оскільки ми не знаємо, чи будемо коли-небудь поводитися з винятками по-іншому, нам слід залишити код коротко, і якщо і коли настане час, тоді і тільки тоді ми повинні підтипу .

Я хотів би почути будь-який аргумент для кожного випадку.


2
ЯГНІ ... Він вам зараз не потрібен, і ви завжди можете додавати його пізніше без особливих труднощів.
Роберт Харві

Чи є у вас приклади? Ви просто піднімаєте Exception, наприклад, або більш конкретні вбудовані помилки?
jonrsharpe

просто підняття Винятку ("конкретний опис")
Езра

Принаймні @Ezra, ви повинні побачити, чи є більш вбудований виняток (див. Docs.python.org/2/library/exceptions.html ).
jonrsharpe

Відповіді:


8

Ти правий

Аргумент для вашої сторони вже згадується Робертом Харві: не додайте код, який вам зараз не потрібен, тим більше, що його легко додати пізніше.

Ваш рецензент теж правий

З іншого боку, також зрозумілий пункт рецензента:

  • Повернення загального Exception()не дуже допомагає абоненту: хоча опис винятку вказує людині, що відбувається, поводження з винятками по-різному програмно може бути неможливим. Розробник, що використовує ваш код, може неохоче змінювати типи винятків , у тому числі через страх (виправданий чи ні) щось зламати.

    Зауважте, що додавати спеціальні винятки зараз не так складно :

    class MyCustomException(Exception):
        pass

    це все, що вам потрібно. Це лише два рядки коду (враховуючи, що вам навіть не знадобиться створювати окремий файл, якщо ви поміщаєте власні винятки в один файл).

  • Сам код виглядає краще, читабельніше.

    if price < self.PriceMinValue:
        raise OutOfRangeException("The price is inferior to zero.")

    виглядає трохи читабельніше порівняно з:

    if price < self.PriceMinValue:
        raise Exception("The price is inferior to zero.")

    через вказівку типу винятку:

    • У другому фрагменті коду мені потрібно прочитати опис і здогадатися, що ціна поза діапазоном (а може і ні? Можливо, є випадки, коли ціна може бути негативною, наприклад, знижки?)

    • У першому фрагменті коду огляд на тип дає негайну вказівку про помилку. Схоже, існує цілий набір дозволених значень для ціни, а поточне значення знаходиться поза цим набором.

Тому?

Тому:

  • Обидва підходи дійсні. Якщо ви не підкласуєте винятки, коли вам не потрібні спеціальні типи, ви маєте рацію. Якщо ви робите підклас винятків, оскільки це нічого не коштує, і це може бути корисно пізніше, ви маєте рацію.

  • Будьте послідовними зі своєю командою. Якщо ваша команда широко використовує власні винятки, використовуйте їх.


2
Але є золота середина: raise ValueError('The price is less than zero'). Це більш конкретно, ніж основа Exception, але без суєти.
jonrsharpe

+1 за просте твердження "будь послідовний", з командою, якщо у вас є, з собою, якщо ви цього не зробите.
Styne666
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.