What about a third option - if a cancellation function raises an exception, fail the Deferred with that exception.