витая: ошибка против ошибки - PullRequest
4 голосов
/ 10 августа 2010

Когда я должен использовать twisted.python.failure.Failure, и когда я должен использовать что-то вроде twisted.internet.error.ConnectionDone? Или я должен сделать twisted.python.failure.Failure(twisted.internet.error.ConnectionDone), и если да, то в каком случае я должен это сделать?

1 Ответ

9 голосов
/ 10 августа 2010

A Failure представляет исключение и трассировку (часто отличается от текущей трассировки стека).Вы должны использовать Failure при создании асинхронного исключения.Итак, когда вы собираетесь запустить Deferred с ошибкой или когда вы собираетесь вызвать метод, такой как IProtocol.connectionLost или ClientFactory.clientConnectionFailed.Это связано с тем, что в таких случаях требуется возможность связать трассировку другого стека с исключением, чем текущая трассировка стека.

Не следует использовать Failure(ConnectionDone), поскольку правильный вызов с одним аргументом Failure принимает экземпляр исключения, а не класс исключения.Поэтому вместо этого используйте Failure(ConnectionDone()).Вы также можете использовать форму с нулевым аргументом для создания нового Failure: Failure().Это работает только при наличии «текущего» исключения, например, в наборе оператора except.Он создает Failure, используя это текущее исключение, а также его трассировку.

Вы также можете создать Failure с тремя аргументами, классом исключений, экземпляром и трассировкой.Чаще всего это делается с использованием возвращаемого значения sys.exc_info().

Когда вы просто хотите вызвать исключение, вам не нужно создавать Failure.Просто сделайте то, что вы обычно делаете в программе Python, чтобы вызвать исключение: raise SomeException(...).

...