I think it would be useful if there was a way to skip into the next except block, perhaps with continue as I think it's currently always illegal to use in an except block. I don't believe there's currently a way to do this.<div>
<br></div><div>This is my reasoning, often there's multiple reasons for exceptions that raise the same exception, as an example an IOError might get raised for lots of different reasons. If you want to handle one or several of these reasons, you have to catch all exceptions of this type, but there's not really a way to "put back" the exception if it isn't the type you were after. For instance</div>
<div><br></div><div><font face="courier new, monospace">try:</font></div><div><font face="courier new, monospace">    operation()</font></div><div><font face="courier new, monospace">except IOError as err:</font></div><div>
<font face="courier new, monospace">    if err.errno == 2:</font></div><div><font face="courier new, monospace">        do_something()</font></div><div><font face="courier new, monospace">    else:</font></div><div><font face="courier new, monospace">        continue #This would continue the except down to the next check, except Exception</font></div>
<div><font face="courier new, monospace">except Exception as err:</font></div><div><font face="courier new, monospace">    logger.error("Error performing operation: {}".format(err.message)")</font></div><div>
<font face="courier new, monospace">    some_clean_up()</font></div><div><font face="courier new, monospace">    raise</font></div><div><br></div><div><br></div><div>The current alternatives to get this behaviour I don't believe are as nice, but maybe I'm missing something</div>
<div><br></div><div>This works but clearly not as nice with nested try excepts,</div><div><font face="courier new, monospace">try:</font></div><div><font face="courier new, monospace">    try:</font></div><div><font face="courier new, monospace">        operation()</font></div>
<div><font face="courier new, monospace">    except IOError as err:</font></div><div><font face="courier new, monospace">        if err.errno == 2:</font></div><div><font face="courier new, monospace">            do_something()</font></div>
<div><font face="courier new, monospace">        else:</font></div><div><font face="courier new, monospace">            raise</font></div><div><div><font face="courier new, monospace">except Exception as err:</font></div>
<div><font face="courier new, monospace">    logger.error("Error performing operation: {}".format(err.message))</font></div><div><font face="courier new, monospace">    some_clean_up()</font></div><div><font face="courier new, monospace">    raise</font></div>
</div><div><br></div><div>This is clearly a not very good and un-dry solution:</div><div><div><font face="courier new, monospace">try:</font></div><div><font face="courier new, monospace">    operation()</font></div><div>
<font face="courier new, monospace">except IOError as err:</font></div><div><font face="courier new, monospace">    if err.errno == 2:</font></div><div><font face="courier new, monospace">        do_something()</font></div>
<div><font face="courier new, monospace">    else:</font></div><div><font face="courier new, monospace">        logger.error("Error performing operation: {}".format(err.message))</font></div><div><font face="courier new, monospace">        some_clean_up()</font></div>
<div><font face="courier new, monospace">        raise</font></div><div><font face="courier new, monospace">except Exception as err:</font></div><div><font face="courier new, monospace">    logger.error("Error performing operation: {}".format(err.message))</font></div>
<div><font face="courier new, monospace">    some_clean_up()</font></div><div><font face="courier new, monospace">    raise</font></div></div><div><br></div><div>There's the option of using a context manager, but personally I don't think it's as explicit or as obvious as a try except block, but maybe others would disagree<br>
<font face="courier new, monospace">class SpecificCaseErrorHandler(object):<br>    def __enter__(self):<br>        pass<br><br>    def __exit__(self, exc_type, exc_value, tb):<br>        if exc_type is not None:<br>            if exc_type is IOError and exc_value.errno == 2:<br>
                do_something()<br>                return True</font><br>            <span style="font-family:'courier new',monospace">      logger.error("Error performing operation: {}".format(err.message))</span></div>
<div><font face="courier new, monospace">            some_clean_up()</font></div><div><font face="courier new, monospace"><br></font></div><div><font face="courier new, monospace">with </font><span style="font-family:'courier new',monospace">SpecificCaseErrorHandler():</span></div>
<div><span style="font-family:'courier new',monospace">    operation()</span></div>