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(...)
.