document.write('<link rel="stylesheet" href="http://gist.github.com/stylesheets/gist/embed.css"/>')





document.write('<div id=\"gist-148135\" class=\"gist\">\n  \n  \n    \n            \n\n      <div class=\"gist-file\">\n        <div class=\"gist-data gist-syntax\">\n          \n          \n          \n            <div class=\"gist-highlight\"><pre><div class=\"line\" id=\"LC1\"><span class=\"c\">#!/usr/bin/python<\/span><\/div><div class=\"line\" id=\"LC2\"><span class=\"c\">#<\/span><\/div><div class=\"line\" id=\"LC3\"><span class=\"c\"># This code sample shows (what I hope to be) the right way to reraise an exception in the<\/span><\/div><div class=\"line\" id=\"LC4\"><span class=\"c\"># situation where you have to perform some cleanup before reraising.<\/span><\/div><div class=\"line\" id=\"LC5\"><span class=\"c\">#<\/span><\/div><div class=\"line\" id=\"LC6\">&nbsp;<\/div><div class=\"line\" id=\"LC7\"><span class=\"n\">cleaned_up<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">False<\/span><\/div><div class=\"line\" id=\"LC8\">&nbsp;<\/div><div class=\"line\" id=\"LC9\"><span class=\"k\">def<\/span> <span class=\"nf\">raiser<\/span><span class=\"p\">():<\/span><\/div><div class=\"line\" id=\"LC10\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">raise<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;this should be reported at line 10&quot;<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC11\">&nbsp;<\/div><div class=\"line\" id=\"LC12\"><span class=\"k\">def<\/span> <span class=\"nf\">cleanup_raises<\/span><span class=\"p\">():<\/span><\/div><div class=\"line\" id=\"LC13\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">global<\/span> <span class=\"n\">cleaned_up<\/span><\/div><div class=\"line\" id=\"LC14\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">cleaned_up<\/span> <span class=\"o\">=<\/span> <span class=\"bp\">True<\/span><\/div><div class=\"line\" id=\"LC15\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">raise<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">(<\/span><span class=\"s\">&quot;you should not see this!&quot;<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC16\">&nbsp;<\/div><div class=\"line\" id=\"LC17\"><span class=\"k\">def<\/span> <span class=\"nf\">reraiser1<\/span><span class=\"p\">():<\/span><\/div><div class=\"line\" id=\"LC18\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC19\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">raiser<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC20\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">except<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC21\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC22\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">cleanup_raises<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC23\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">except<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC24\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">pass<\/span><\/div><div class=\"line\" id=\"LC25\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># Wrong: stack trace reports this as the original scene of the<\/span><\/div><div class=\"line\" id=\"LC26\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># crime. Location information should say line 10 but it doesn&#39;t<\/span><\/div><div class=\"line\" id=\"LC27\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">raise<\/span> <span class=\"n\">e<\/span><\/div><div class=\"line\" id=\"LC28\">&nbsp;<\/div><div class=\"line\" id=\"LC29\"><span class=\"k\">def<\/span> <span class=\"nf\">reraiser2<\/span><span class=\"p\">():<\/span><\/div><div class=\"line\" id=\"LC30\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC31\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">raiser<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC32\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">except<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC33\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC34\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">cleanup_raises<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC35\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">except<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC36\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">pass<\/span><\/div><div class=\"line\" id=\"LC37\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># Wrong: stack trace reports cleanup_raises as the culprit. We<\/span><\/div><div class=\"line\" id=\"LC38\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># want to know about raiser.<\/span><\/div><div class=\"line\" id=\"LC39\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">raise<\/span><\/div><div class=\"line\" id=\"LC40\">&nbsp;<\/div><div class=\"line\" id=\"LC41\"><span class=\"k\">def<\/span> <span class=\"nf\">reraiser3<\/span><span class=\"p\">():<\/span><\/div><div class=\"line\" id=\"LC42\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC43\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">raiser<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC44\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">except<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC45\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">def<\/span> <span class=\"nf\">cleanup<\/span><span class=\"p\">():<\/span><\/div><div class=\"line\" id=\"LC46\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC47\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">cleanup_raises<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC48\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">except<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC49\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">pass<\/span><\/div><div class=\"line\" id=\"LC50\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">cleanup<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC51\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># Right: Need to make sure that exceptions from cleanup_raises<\/span><\/div><div class=\"line\" id=\"LC52\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># are handled in a separate scope. This reports the original<\/span><\/div><div class=\"line\" id=\"LC53\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># exception location of raiser at line 10.<\/span><\/div><div class=\"line\" id=\"LC54\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">raise<\/span><\/div><div class=\"line\" id=\"LC55\">&nbsp;<\/div><div class=\"line\" id=\"LC56\"><span class=\"k\">def<\/span> <span class=\"nf\">reraiser4<\/span><span class=\"p\">():<\/span><\/div><div class=\"line\" id=\"LC57\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC58\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">raiser<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC59\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">except<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">,<\/span> <span class=\"n\">e<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC60\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"p\">(<\/span><span class=\"n\">_<\/span><span class=\"p\">,<\/span> <span class=\"n\">_<\/span><span class=\"p\">,<\/span> <span class=\"n\">traceback<\/span><span class=\"p\">)<\/span> <span class=\"o\">=<\/span> <span class=\"n\">sys<\/span><span class=\"o\">.<\/span><span class=\"n\">exc_info<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC61\">&nbsp;<\/div><div class=\"line\" id=\"LC62\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC63\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">cleanup_raises<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC64\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">except<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC65\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">pass<\/span><\/div><div class=\"line\" id=\"LC66\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># Right: Raise exception but provide original traceback<\/span><\/div><div class=\"line\" id=\"LC67\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># info. (Note: must call sys.exc_info() before calling any<\/span><\/div><div class=\"line\" id=\"LC68\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># other possible raiser.) This also reports raiser at line 10.<\/span><\/div><div class=\"line\" id=\"LC69\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">raise<\/span> <span class=\"n\">e<\/span><span class=\"p\">,<\/span> <span class=\"bp\">None<\/span><span class=\"p\">,<\/span> <span class=\"n\">traceback<\/span><\/div><div class=\"line\" id=\"LC70\">&nbsp;<\/div><div class=\"line\" id=\"LC71\"><span class=\"k\">def<\/span> <span class=\"nf\">reraiser5<\/span><span class=\"p\">():<\/span><\/div><div class=\"line\" id=\"LC72\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC73\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">raiser<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC74\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">finally<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC75\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">try<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC76\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">cleanup_raises<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC77\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">except<\/span> <span class=\"ne\">RuntimeError<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC78\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">pass<\/span><\/div><div class=\"line\" id=\"LC79\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># Right: Don&#39;t even catch the original exception -- just clean<\/span><\/div><div class=\"line\" id=\"LC80\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"c\"># up on the way out.<\/span><\/div><div class=\"line\" id=\"LC81\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"k\">assert<\/span><span class=\"p\">(<\/span><span class=\"n\">cleaned_up<\/span><span class=\"p\">)<\/span><\/div><div class=\"line\" id=\"LC82\">&nbsp;<\/div><div class=\"line\" id=\"LC83\"><span class=\"kn\">import<\/span> <span class=\"nn\">sys<\/span><\/div><div class=\"line\" id=\"LC84\"><span class=\"n\">variant<\/span> <span class=\"o\">=<\/span> <span class=\"n\">sys<\/span><span class=\"o\">.<\/span><span class=\"n\">argv<\/span><span class=\"p\">[<\/span><span class=\"mi\">1<\/span><span class=\"p\">]<\/span><\/div><div class=\"line\" id=\"LC85\"><span class=\"k\">if<\/span> <span class=\"n\">variant<\/span> <span class=\"o\">==<\/span> <span class=\"s\">&#39;1&#39;<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC86\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">reraiser1<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC87\"><span class=\"k\">elif<\/span> <span class=\"n\">variant<\/span> <span class=\"o\">==<\/span> <span class=\"s\">&#39;2&#39;<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC88\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">reraiser2<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC89\"><span class=\"k\">elif<\/span> <span class=\"n\">variant<\/span> <span class=\"o\">==<\/span> <span class=\"s\">&#39;3&#39;<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC90\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">reraiser3<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC91\"><span class=\"k\">elif<\/span> <span class=\"n\">variant<\/span> <span class=\"o\">==<\/span> <span class=\"s\">&#39;4&#39;<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC92\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">reraiser4<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC93\"><span class=\"k\">elif<\/span> <span class=\"n\">variant<\/span> <span class=\"o\">==<\/span> <span class=\"s\">&#39;5&#39;<\/span><span class=\"p\">:<\/span><\/div><div class=\"line\" id=\"LC94\">&nbsp;&nbsp;&nbsp;&nbsp;<span class=\"n\">reraiser5<\/span><span class=\"p\">()<\/span><\/div><div class=\"line\" id=\"LC95\">&nbsp;<\/div><\/pre><\/div>\n          \n        <\/div>\n\n        <div class=\"gist-meta\">\n          <a href=\"http://gist.github.com/raw/148135/3d25d5fc804bf0033cdc159ecc93a6610a57d6e5/cleanup_and_reraise.py\" style=\"float:right;\">view raw<\/a>\n          <a href=\"http://gist.github.com/148135#file_cleanup_and_reraise.py\" style=\"float:right;margin-right:10px;color:#666\">cleanup_and_reraise.py<\/a>\n          <a href=\"http://gist.github.com/148135\">This Gist<\/a> brought to you by <a href=\"http://github.com\">GitHub<\/a>.\n        <\/div>\n      <\/div>\n    \n  \n<\/div>\n')
