<div dir="ltr"><p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">Hi,</p><p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">
As itamar mentioned in ticket <a href="http://tm.tl/#6676">#6676</a>, If a cancellation function for a Deferred throws an exception(the <code style="outline:none 0px">cancel()</code> method of <code style="outline:none 0px">Deferred</code> won’t throw exceptions, but the canceller may), behavior is undefined. If the cancellation function throws an exception it is currently not caught, and cancellation does not occur.</p>
<p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">We can catch the exception and log it, and fallback to just firing <code style="outline:none 0px">Deferred</code> with<code style="outline:none 0px">CancelledError</code>. This won’t break any old code. But an exception raising from the cancellation function often means the cancellation is failed.</p>
<p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">Another option we have is taking this opportunity to make the cancellation being able to fail. There is the motivation:</p>
<p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">There are cases where a <code style="outline:none 0px">Deferred</code> is uncancellable. For example, we can call <code style="outline:none 0px">twisted.mail.imap4.IMAP4Client.delete</code> to delete a mailbox. When the operation is waiting in the queue, we can cancel it by removing it from the queue. However, when the operation is already sent and is waiting for the response, it becomes uncancellable.</p>
<p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">If we allow the canceller(NOT the <code style="outline:none 0px">cancel()</code> method of the <code style="outline:none 0px">Deferred</code>) to raise an exception, we can tell the user the cancellation is failed and the <code style="outline:none 0px">Deferred</code>won’t be fired with a <code style="outline:none 0px">CancelledError</code>.</p>
<p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">Raising an exception from <code style="outline:none 0px">cancel()</code> may break the old code. So we can catch the exception raised by the canceller, then return a <code style="outline:none 0px">False</code> without firing the<code style="outline:none 0px">Deferred</code> to tell the user that the cancellation is failed.</p>
<p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">In order to avoid missing unexpected exceptions, we can create a <code style="outline:none 0px">CancellationFailedError</code>. When the canceller raises <code style="outline:none 0px">CancellationFailedError</code>, we catch it and return <code style="outline:none 0px">False</code>. When the canceller raises others exceptions, we catch it, log it then return <code style="outline:none 0px">False</code>.<br>
</p><p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">Something like this:</p><p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">
</p><pre style="margin-top:0px;margin-bottom:20px;padding:10px;border:0px;outline:0px;font-size:13px;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Anonymous Pro','Courier New',monospace,serif;vertical-align:baseline;background-color:rgb(238,238,238);overflow:scroll;border-top-left-radius:3px;border-top-right-radius:3px;border-bottom-right-radius:3px;border-bottom-left-radius:3px;color:rgb(76,76,76)">
<code class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline"><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">def</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> cancel</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">(</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">self</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">):</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
    </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">if</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">not</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">self</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">called</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">:</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
        canceller </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">=</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">self</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">_canceller
        </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">if</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> canceller</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">:</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
            </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">try</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">:</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
                canceller</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">(</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">self</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">)</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
            </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">except</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,0,102)">CancellationFailedError</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">:</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
                </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">return</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">False</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
            </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">except</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,0,102)">Exception</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">:</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
                log</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">err</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">(</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">None</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">,</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,136,0)">"Unexpected exception from canceller."</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">)</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
                </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">return</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">False</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
        </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">else</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">:</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
            </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(136,0,0)"># Arrange to eat the callback that will eventually be fired</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
            </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(136,0,0)"># since there was no real canceller.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
            </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">self</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">_suppressAlreadyCalled </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">=</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">True</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
        </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">if</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">not</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">self</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">called</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">:</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
            </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(136,0,0)"># There was no canceller, or the canceller didn't call</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
            </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(136,0,0)"># callback or errback.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
            </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">self</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">errback</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">(</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">failure</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,0,102)">Failure</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">(</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,0,102)">CancelledError</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">()))</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
        </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">return</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">True</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
    </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">elif</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> isinstance</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">(</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">self</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">result</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">,</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,0,102)">Deferred</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">):</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
        </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(136,0,0)"># Waiting for another deferred -- cancel it instead.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
        </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">return</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">self</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">result</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">.</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">cancel</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">()</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
    </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">else</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(102,102,0)">:</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)">
        </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">return</span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,0)"> </span><span class="" style="margin:0px;padding:0px;border:0px;outline:0px;font-style:inherit;font-family:inherit;vertical-align:baseline;color:rgb(0,0,136)">False</span></code></pre>
<p></p><p></p><p></p><p style="outline:none 0px;margin:0px 0px 10px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">This won’t break any code by raising an exception from <code style="outline:none 0px">cancel()</code>, although some code may rely on <code style="outline:none 0px">cancel()</code> not returning any value.</p>
<p style="outline:none 0px;margin:0px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">So, what’s your opinion on raising an exception from the canceller?</p>
<p style="outline:none 0px;margin:0px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px"><br></p><p style="outline:none 0px;margin:0px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">
Regards,</p><p style="outline:none 0px;margin:0px;color:rgb(68,68,68);font-family:'Helvetica Neue',HelveticaNeue,Helvetica,Arial,sans-serif;font-size:14px;line-height:19px">-Kai</p></div>