<div dir="ltr"><div>Hello:</div><div><br></div><div>Please refer to the following script:</div><div><br></div><div><div><font face="courier new, monospace">import sys</font></div><div><font face="courier new, monospace">import twisted.internet.defer</font></div>
<div><font face="courier new, monospace">import twisted.internet.reactor</font></div><div><font face="courier new, monospace">import twisted.python.log</font></div><div><font face="courier new, monospace"><br></font></div>
<div><font face="courier new, monospace">print "Twisted version", twisted.version</font></div><div><font face="courier new, monospace">print "Python version", sys.version</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">class ExceptionToRaise(Exception):</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">     </span>pass</font></div><div><font face="courier new, monospace"><br>
</font></div><div><font face="courier new, monospace">exception_to_raise = ExceptionToRaise()</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">@twisted.internet.defer.inlineCallbacks</font></div>
<div><font face="courier new, monospace">def icb_error_maker():</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>"""</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>Raises an exception implemented as an inline inlineCallbacks</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>"""</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>raise exception_to_raise </font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">def pod_error_maker():</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>"""</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>Raises an exception implemented as a plain old deferred</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">   </span>"""</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>deferred = twisted.internet.defer.Deferred()</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>deferred.errback(exception_to_raise)</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>return deferred</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">#ERROR_MAKER_TO_USE = icb_error_maker</font></div>
<div><font face="courier new, monospace">ERROR_MAKER_TO_USE = pod_error_maker</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">@twisted.internet.defer.inlineCallbacks</font></div>
<div><font face="courier new, monospace">def intermediate_function3():</font></div><div><span class="" style="white-space:pre"><font face="courier new, monospace">   </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>print 'intermediate_function3 1'</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>try:</font></div><div><span class="" style="white-space:pre"><font face="courier new, monospace">              </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">          </span>yield ERROR_MAKER_TO_USE()</font></div>
<div><span class="" style="white-space:pre"><font face="courier new, monospace">                </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>except BaseException as exception:</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">                </span>print 'intermediate_function3 exception', repr(exception)</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">         </span>raise</font></div>
<div><span class="" style="white-space:pre"><font face="courier new, monospace">        </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>print 'intermediate_function3 2'</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">@twisted.internet.defer.inlineCallbacks</font></div><div><font face="courier new, monospace">def intermediate_function2():</font></div>
<div><span class="" style="white-space:pre"><font face="courier new, monospace">        </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>print 'intermediate_function2 1'</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>try:</font></div><div><span class="" style="white-space:pre"><font face="courier new, monospace">              </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">          </span>yield intermediate_function3()</font></div>
<div><span class="" style="white-space:pre"><font face="courier new, monospace">                </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>except BaseException as exception:</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">                </span>print 'intermediate_function2 exception', repr(exception)</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">         </span>raise</font></div>
<div><span class="" style="white-space:pre"><font face="courier new, monospace">                </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>print 'intermediate_function2 2'</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">@twisted.internet.defer.inlineCallbacks</font></div><div><font face="courier new, monospace">def intermediate_function1():</font></div>
<div><span class="" style="white-space:pre"><font face="courier new, monospace">        </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>print 'intermediate_function1 1'</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>try:</font></div><div><span class="" style="white-space:pre"><font face="courier new, monospace">              </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">          </span>yield intermediate_function2()</font></div>
<div><span class="" style="white-space:pre"><font face="courier new, monospace">                </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>except BaseException as exception:</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">                </span>print 'intermediate_function1 exception', repr(exception)</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">         </span>raise</font></div>
<div><span class="" style="white-space:pre"><font face="courier new, monospace">                </font></span></div><div><span class="" style="white-space:pre"><font face="courier new, monospace">          </font></span></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">  </span>print 'intermediate_function1 2'</font></div>
<div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">def run():</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">    </span>d = intermediate_function1()</font></div>
<div><font face="courier new, monospace"><span class="" style="white-space:pre">        </span>d.addErrback(twisted.python.log.err)</font></div><div><font face="courier new, monospace"><span class="" style="white-space:pre">      </span>d.addBoth(lambda n: twisted.internet.reactor.stop())</font></div>
<div><span class="" style="white-space:pre"><font face="courier new, monospace">        </font></span></div><div><font face="courier new, monospace">twisted.internet.reactor.callWhenRunning(run)</font></div><div><font face="courier new, monospace">twisted.internet.reactor.run()</font></div>
</div><div><br></div><div><br></div><div>When <span style="font-family:'courier new',monospace">ERROR_MAKER_TO_USE = icb_error_maker </span>The output is as follows:</div><div><br></div><div><div>Twisted version [twisted, version 13.2.0]</div>
<div>Python version 2.7.3 (default, Feb 27 2014, 20:00:17) </div><div>[GCC 4.6.3]</div><div>intermediate_function1 1</div><div>intermediate_function2 1</div><div>intermediate_function3 1</div><div>intermediate_function3 exception ExceptionToRaise()</div>
<div>intermediate_function2 exception ExceptionToRaise()</div><div>intermediate_function1 exception ExceptionToRaise()</div><div>Unhandled Error</div><div>Traceback (most recent call last):</div><div>  File "/home/daveb/bzr_repo/player_rm2/test2/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 1237, in unwindGenerator</div>
<div>    return _inlineCallbacks(None, gen, Deferred())</div><div>  File "/home/daveb/bzr_repo/player_rm2/test2/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 1099, in _inlineCallbacks</div><div>
    result = g.send(result)</div><div>  File "icb_error_test1.py", line 52, in intermediate_function2</div><div>    yield intermediate_function3()</div><div>  File "/home/daveb/bzr_repo/player_rm2/test2/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 1237, in unwindGenerator</div>
<div>    return _inlineCallbacks(None, gen, Deferred())</div><div>--- <exception caught here> ---</div><div>  File "/home/daveb/bzr_repo/player_rm2/test2/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 1099, in _inlineCallbacks</div>
<div>    result = g.send(result)</div><div>  File "icb_error_test1.py", line 37, in intermediate_function3</div><div>    yield ERROR_MAKER_TO_USE()</div><div>  File "/home/daveb/bzr_repo/player_rm2/test2/local/lib/python2.7/site-packages/twisted/internet/defer.py", line 1228, in unwindGenerator</div>
<div>    gen = f(*args, **kwargs)</div><div>  File "icb_error_test1.py", line 19, in icb_error_maker</div><div>    raise exception_to_raise</div><div>__main__.ExceptionToRaise: </div></div><div><br></div><div>However when <span style="font-family:'courier new',monospace">ERROR_MAKER_TO_USE = pod_error_maker </span>The output is as follows:</div>
<div><br></div><div><div>Twisted version [twisted, version 13.2.0]</div><div>Python version 2.7.3 (default, Feb 27 2014, 20:00:17) </div><div>[GCC 4.6.3]</div><div>intermediate_function1 1</div><div>intermediate_function2 1</div>
<div>intermediate_function3 1</div><div>intermediate_function3 exception ExceptionToRaise()</div><div>intermediate_function2 exception ExceptionToRaise()</div><div>intermediate_function1 exception ExceptionToRaise()</div>
<div>Unhandled Error</div><div>Traceback (most recent call last):</div><div>Failure: __main__.ExceptionToRaise: </div></div><div><br></div><div>Questions:<br></div><div><br></div><div>1. Why is it that <span style="font-family:'courier new',monospace">icb_error_maker</span> raises an exception that retains its traceback while <span style="font-family:'courier new',monospace">pod_error_maker</span> does not?</div>
<div>2. How might one retain the inlineCallback trace when handling Exceptions/Failures from deferreds? (I would prefer a universal method, ie not doing a Try/Reraise at every yield point) ?</div><div>3. I have taken a look at the code in twisted/internet/defer.py and I am not sure where the distinction between inlineCallback exceptions and deferred errors are being made.  Would someone please elaborate on this process.</div>
<div><br></div><div>Thanks</div><div><br></div></div>