Объект не в нужном состоянии; какое исключение уместно? - PullRequest
3 голосов
/ 22 сентября 2011

Скажем, у меня есть

class Rocket(object):
    def __init__(self):
        self.ready = False

    def prepare_for_takeoff(self):
        self.ready = True

    def takeoff(self):
        if not self.ready:
            raise NotReadyException("not ready!")
        print("Liftoff!")

Теперь, какое из стандартных исключений будет наиболее подходящим для получения NotReadyException из?Будет ли это ValueError, поскольку self имеет неправильное состояние / значение?

Ответы [ 2 ]

6 голосов
/ 22 сентября 2011

Теперь, какое из стандартных исключений будет наиболее уместным для получения NotReadyException из?

Exception

Не связывайтесь ни с чем другим.

http://code.google.com/p/soc/wiki/PythonStyleGuide#Exceptions

Каковы ваши варианты использования для обработки исключений?

Если бы вы извлекли свое исключение из, скажем, ValueError, вы бы когда-нибудь написали обработчик, который использовал бы except ValueError:, чтобы перехватить оба исключения и обработать их точно так же?Навряд ли.

ValueError является универсальным, когда более конкретные исключения не подходят.Ваше исключение очень специфично.

Если у вас есть подобное исключение для конкретного приложения, вероятность его использования любой полезной семантики со встроенным исключением является низкой.Шансы на фактическое объединение нового и существующего исключения в один обработчик очень и очень малы.

Единственный случай, когда вы когда-либо объедините исключение для конкретного приложения с общими исключениями, - это использование except Exception: в каком-то универсальном логгере.

2 голосов
/ 22 сентября 2011

Я бы просто вывел его из Exception. Программисты, которые ловят ValueError, могут быть весьма удивлены, что они поймали и вашу NotReadyException.

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

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