Подтвердить что ты не робот

Лучшие практики для исключений Python?

Каковы наилучшие методы для создания исключений? Я только что видел это, и я не знаю, должен ли я быть в ужасе или как это. Я несколько раз читал в книгах, что исключения никогда не должны содержать строку, потому что сами строки могут генерировать исключения. Любая реальная правда?

В основном из моего понимания из сценариев является то, что это было сделано, поэтому все внутренние библиотеки Python будут иметь общий формат сообщений об ошибках (что-то, что отчаянно необходимо), поэтому я могу понять, почему создание строки сообщения об ошибках является хорошей идеей. (Почти каждый метод выдает исключения из-за полной потребности в недействительном прохождении).

Этот код выглядит следующим образом:

"""
Base Exception, Error
"""
class Error(Exception):
    def __init__(self, message):
        self.message = message

    def __str__(self):
        return "[ERROR] %s\n" % str(self.message)

    def log(self):
        ret = "%s" % str(self.message)
        if(hasattr(self, "reason")):
            return "".join([ret, "\n==> %s" % str(self.reason)])
        return ret

class PCSException(Error):
    def __init__(self, message, reason = None):
        self.message = message
        self.reason = reason
    def __str__(self):
        ret = "[PCS_ERROR] %s\n" % str(self.message)
        if(self.reason != None):
            ret += "[REASON] %s\n" % str(self.reason)
        return ret

Это только верхушка айсберга, но может ли кто-нибудь дать мне некоторое представление о том, что делает эту ужасную идею? Или, если процесс кодирования с гораздо лучшим исключением/стиль.

4b9b3361

Ответ 1

Я читал несколько раз в книгах, которые исключения никогда не должны string, потому что сами строки могут бросать исключения. Любая реальная правда это?

Что?

Просьба указать ссылку или ссылку на нее. Это совершенно неверно.

Поскольку все объекты могут генерировать исключения, ни один объект не может содержаться в исключении по этой логике.

Нет, "никакие строки" просто сумасшедшие в контексте Python. Возможно, вы прочитали его в контексте С++.


Edit

Когда-то (в прежние времена) вы могли поднять исключение Python по имени вместо фактического класса.

raise "SomeNameOfAnExceptionClass"

Это плохо. Но это не включает строку внутри исключения. Это именование исключения со строкой вместо фактического объекта класса. В 2.5 это может по-прежнему работать, но получает предупреждение об отказе.

Возможно, это то, что вы читаете "Не поднимайте исключение со строковым именем"

Ответ 2

Надежная обработка исключений (в Python) - это сообщение "лучшие практики для исключений Python", которое я написал некоторое время назад. Вы можете найти это полезным.

Некоторые ключевые моменты из блога:

Никогда не используйте исключения для управления потоком

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

Рассмотрим "find" в строке, возвращающей -1, если шаблон не найден, но индексирование за пределами строки вызывает исключение. Не найти строку является нормальным выполнением.

Обработать исключения на уровне, который знает, как с ними справиться

...

Лучшее место - это часть кода, которая может обрабатывать исключение. Для некоторые исключения, такие как ошибки программирования (например, IndexError, TypeError, NameError и т.д.), Лучше всего оставить программисту/пользователю, потому что "обработка" их просто скроет настоящие ошибки.

Всегда спрашивайте: "Это подходящее место для обработки этого исключения?" и будьте осторожны с улавливанием всех исключений.

Документируйте исключения, созданные вашим кодом

...

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

Ответ 3

Я считаю, что совет против создания исключений со строкой происходит из "Learning Python" (O'Reilly). В разделе, озаглавленном Исключения строк исключаются!, он указывает способность (теперь удаленно) создавать исключение напрямую с произвольной строкой.

Код, который он дает в качестве примера:

myexc = "My exception string"
try:
    raise myexc
except myexc:
    print ('caught')

Это на p858 четвертого издания (в мягкой обложке).

Ответ 4

Первое впечатление, что это слишком большой код для исключения.

Форматирование исключений должно выполняться в конфигурации регистратора. То же самое касается самого журнала.

Он также переопределяет стандартный (и устаревший) атрибут сообщения и не вызывает конструктор суперкласса. (Это могло бы или не нарушить цепочку исключений Python 3.0, я не пробовал, потому что у меня работает 2.6)

Большая часть того, что делает дополнительный код, может быть реализована с использованием BaseException.args, записав в качестве следующего сообщения следующее сообщение:

'\n==> '.join(exception.args)

Я бы сказал, что если что-то может быть сделано с использованием общего/идиоматического механизма, его особенно следует делать при обработке исключений. (Исключения являются механизмом для передачи сигнала через уровни приложений.)

Лично я стараюсь избегать ничего кроме

class SomeException(Exception): pass

(Отказ от ответственности: ответьте субъективным, возможно, по характеру вопроса.)

Ответ 5

class Error(Exception):
    """Base class for other exceptions"""
    pass

class empty_string_error(Error):
    """Raised when the input value is too large"""
    pass
while(1):
    try:
        if("Your Condition"):
            raise empty_string_error
        else:
            print("OUTPUT")
    except empty_string_error:
        print("APT MESSAGE")
        print(" ")
    finally:
        pint("Mandatory code")