<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>http://conquerprogramming.com/blog/rss</id>
  <title>Conquer Programming</title>
  <updated>2022-01-31T20:17:59.269900+00:00</updated>
  <author>
    <name>Ronald Hayden</name>
    <email>ron@conquerprogramming.com</email>
  </author>
  <link href="http://conquerprogramming.com/blog/rss"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="0.9.0">python-feedgen</generator>
  <logo>http://conquerprogramming.com/assets/conquer_logo_header.png</logo>
  <subtitle>Tales of Technology</subtitle>
  <entry>
    <id>http://conquerprogramming.com/blog/3</id>
    <title>Python Exceptions are Exceptional (and so much more than error handling!)</title>
    <updated>2019-01-23T12:00:00-08:00</updated>
    <author>
      <name>Ronald Hayden</name>
      <email>ron@conquerprogramming.com</email>
      <uri>http://conquerprogramming.com</uri>
    </author>
    <content type="CDATA"><![CDATA[<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Exception handling in Python not only provides a way to respond to errors, it allows you to elegantly structure your code and solve problems, reduces code, and sometimes speeds up your script. Being Pythonic means knowing how to use exceptions to their full extent. I've learned about exceptions from many different sources, each having a particular insight, but I haven't found one write-up that covers it all, so this entry an attempt at that.</p>
<p></p>
<p>This post is dedicated to exception handling; I'll do a future post on creating and raising exceptions.</p>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2>A bit of exceptional history</h2>
<p>Traditional programming languages tended to treat errors as a catastrophic situation. An error usually meant that the script couldn't possibly continue, and would probably instantly crash. Therefore, the job of the programmer was to do everything in their power to avoid errors.</p>
<p></p>
<p>That meant that the programmer needed to check for everything that could go wrong before calling a function: Does the file exist? Is the network up? Etc. And if something unexpected went wrong, then the script crashed anyway.</p>
<p></p>
<p>The process of checking for every possible error condition ahead of time is known as <i>Look Before You Leap</i>, or <i>LBYL</i>.</p>
<p></p>
<h3>Enter exception handling</h3>
<p><i>Exception handling</i> provided a more robust mechanism for dealing with errors. Rather than instantly crashing, the error would result in an <i>exception</i> being raised (or <i>thrown</i>, as many languages describe it), allowing the programmer to <i>catch</i> the exception and choose how to respond to an error situation.</p>
<p></p>
<p>However, most programmers have retained that original fear of something going wrong, and are still trained to do everything they can to avoid an exception from being raised. Exceptions are still thought of as just a way to respond to catastrophic errors.</p>
<p></p>
<h3>Exceptions separate return values from errors</h3>
<p>A huge benefit of exceptions in any language is that they solve the age-old problem of combining return values and error codes. Before exceptions, if an error occurred that didn't crash the script, then the function needed a way to indicate the error.</p>
<p></p>
<p>Typically, this meant that usually a function would return a number or string or whatever if everything had worked properly, or it would return <code>0</code> if an error occurred.</p>
<p></p>
<p>Unfortunately, for some functions, <code>0</code> could be a valid return value, so in that case they had to find a different value. Perhaps <code>-1</code> would indicate an error. But what if <code>-1</code> was a valid return value? Then maybe <code>999,999</code> would indicate an error...so the programmer was stuck reading through the documentation for each function to determine what return value indicated an error.</p>
<p></p>
<p>Exceptions solved this, because if nothing went wrong, then a valid value was returned. If something did go wrong, and exception was thrown, which was handled separately from the return value.</p>
<p></p>
<p></p>
<h2>Basics of exception handling in Python</h2>
<p>Suppose you are going to open a file to read data. If the file you are expecting doesn't exist, an exception is raised and your script crashes:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">myfile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;input.txt&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
<div class="div_foreground div_background" style="font-size: normal;" >
<pre class="ansi2html-content">
<span class="ansi31">---------------------------------------------------------------------------</span>
<span class="ansi31">FileNotFoundError</span>                         Traceback (most recent call last)
<span class="ansi32">&lt;ipython-input-1-b1baf1d57877&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi32">----&gt; 1</span><span class="ansi31"> </span>myfile <span class="ansi34">=</span> open<span class="ansi34">(</span><span class="ansi34">'input.txt'</span><span class="ansi34">)</span><span class="ansi34"></span>

<span class="ansi31">FileNotFoundError</span>: [Errno 2] No such file or directory: 'input.txt'
</pre>
</div>
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Exception handling allows you to decide what happens when an error occurs, by putting the potentially problematic code in a <code>try</code> block.</p>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3>The try block</h3>
<p>In Python we don't use the throw and catch terminology -- instead you <i>try</i> an operation ("There is no try, only do", said a wise yet non-Pythonic alien) and if something goes wrong an exception is <i>raised</i> and you can choose to <i>handle</i> it.</p>
<p></p>
<p>Here is an example of simple exception handling, with a <code>try</code> block and an <code>except</code> block:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Trying to open the input file...&#39;</span><span class="p">)</span>
    <span class="n">myfile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;input.txt&#39;</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Something went wrong! Oh well, continuing on and hoping for the best...&#39;</span><span class="p">)</span>
    
<span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Continuing...&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Trying to open the input file...
Something went wrong! Oh well, continuing on and hoping for the best...
Continuing...
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>You can have as much code as you like in a <code>try</code> block. If an exception is raised by any of the code in that block, Python will then look for an exception handler for the exception that was raised. An exception handling block starts with <code>except</code> and specifies which exceptions it handles. In this case, because the <code>except</code> block doesn't specify any particular exceptions, it matches any exception that is raised.</p>
<p></p>
<p>The example above is not particularly robust exception handling (probably we couldn't really continue on at this point), but illustrates the point that you have complete control over what happens when an exception is raised, including the ability to simply ignore it.</p>
<p></p>
<h4>Ignoring an exception with pass</h4>
<p>It turns out there are many cases where you don't actually care if an exception occurs, but you don't want your script to crash. For example, if you call <code>os.mkdir()</code> to create a directory, it raises an exception if the directory already exists:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="s1">&#39;/tmp&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
<div class="div_foreground div_background" style="font-size: normal;" >
<pre class="ansi2html-content">
<span class="ansi31">---------------------------------------------------------------------------</span>
<span class="ansi31">FileExistsError</span>                           Traceback (most recent call last)
<span class="ansi32">&lt;ipython-input-2-3e83acea9779&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi1 ansi32">      1</span> <span class="ansi32">import</span> os<span class="ansi34"></span>
<span class="ansi32">----&gt; 2</span><span class="ansi31"> </span>os<span class="ansi34">.</span>mkdir<span class="ansi34">(</span><span class="ansi34">'/tmp'</span><span class="ansi34">)</span><span class="ansi34"></span>

<span class="ansi31">FileExistsError</span>: [Errno 17] File exists: '/tmp'
</pre>
</div>
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Since you were trying to create the directory, the fact that it already exists is not something you'd consider an error, and you just want to move silently on. You can do this using <code>pass</code>, which is a keyword that means "this code block intentionally left blank":</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
    <span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="s1">&#39;/tmp&#39;</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
    <span class="k">pass</span>

<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Continuing...&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Continuing...
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>In this case, the exception occurred, it was ignored, and you move on.</p>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3>The except block</h3>
<p>When you do want to do something in response to an exception, you usually need to get information about what exception occurred. Let's say you are getting a value from a dictionary and there is no entry for the key you specify:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;penguins&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>

<span class="n">rhino_count</span> <span class="o">=</span> <span class="n">zoo</span><span class="p">[</span><span class="s1">&#39;rhinos&#39;</span><span class="p">]</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;There are </span><span class="si">{</span><span class="n">rhino_count</span><span class="si">}</span><span class="s1"> rhinos in our zoo!&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
<div class="div_foreground div_background" style="font-size: normal;" >
<pre class="ansi2html-content">
<span class="ansi31">---------------------------------------------------------------------------</span>
<span class="ansi31">KeyError</span>                                  Traceback (most recent call last)
<span class="ansi32">&lt;ipython-input-4-fe4d5ddd093e&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi1 ansi32">      1</span> zoo <span class="ansi34">=</span> <span class="ansi34">{</span><span class="ansi34">'penguins'</span><span class="ansi34">:</span> <span class="ansi36">5</span><span class="ansi34">,</span> <span class="ansi34">'lions'</span><span class="ansi34">:</span> <span class="ansi36">12</span><span class="ansi34">,</span> <span class="ansi34">'zebras'</span><span class="ansi34">:</span> <span class="ansi36">1</span><span class="ansi34">}</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      2</span> <span class="ansi34"></span>
<span class="ansi32">----&gt; 3</span><span class="ansi31"> </span>rhino_count <span class="ansi34">=</span> zoo<span class="ansi34">[</span><span class="ansi34">'rhinos'</span><span class="ansi34">]</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      4</span> print<span class="ansi34">(</span><span class="ansi34">f'There are {rhino_count} rhinos in our zoo!'</span><span class="ansi34">)</span><span class="ansi34"></span>

<span class="ansi31">KeyError</span>: 'rhinos'
</pre>
</div>
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Once you realize that it's possible for this code to raise a <code>KeyError</code> exception, you can create a specific exception handler for that case by specifying the exception name as part of the <code>except</code> statement:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;penguins&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">rhino_count</span> <span class="o">=</span> <span class="n">zoo</span><span class="p">[</span><span class="s1">&#39;rhinos&#39;</span><span class="p">]</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;There are </span><span class="si">{</span><span class="n">rhino_count</span><span class="si">}</span><span class="s1"> rhinos in our zoo!&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;There are NO rhinos in our zoo!&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
There are NO rhinos in our zoo!
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>The <code>except KeyError:</code> statement means this exception handler will only be called if it's an exception of type <code>KeyError</code>. Any other exception type will still crash the script. For example, say you do have rhinos in the zoo, but mis-typed the <code>rhino_count</code> variable name in <code>print()</code>:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;penguins&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;rhinos&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">rhino_count</span> <span class="o">=</span> <span class="n">zoo</span><span class="p">[</span><span class="s1">&#39;rhinos&#39;</span><span class="p">]</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;There are </span><span class="si">{</span><span class="n">rhoni_count</span><span class="si">}</span><span class="s1"> rhinos in our zoo!&#39;</span><span class="p">)</span>  <span class="c1"># Error: typo in variable name</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;There are NO rhinos in our zoo!&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
<div class="div_foreground div_background" style="font-size: normal;" >
<pre class="ansi2html-content">
<span class="ansi31">---------------------------------------------------------------------------</span>
<span class="ansi31">NameError</span>                                 Traceback (most recent call last)
<span class="ansi32">&lt;ipython-input-7-509e37c5933e&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi1 ansi32">      3</span> <span class="ansi32">try</span><span class="ansi34">:</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      4</span>     rhino_count <span class="ansi34">=</span> zoo<span class="ansi34">[</span><span class="ansi34">'rhinos'</span><span class="ansi34">]</span><span class="ansi34"></span>
<span class="ansi32">----&gt; 5</span><span class="ansi31">     </span>print<span class="ansi34">(</span><span class="ansi34">f'There are {rhoni_count} rhinos in our zoo!'</span><span class="ansi34">)</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      6</span> <span class="ansi32">except</span> KeyError<span class="ansi34">:</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      7</span>     print<span class="ansi34">(</span><span class="ansi34">'There are NO rhinos in our zoo!'</span><span class="ansi34">)</span><span class="ansi34"></span>

<span class="ansi31">NameError</span>: name 'rhoni_count' is not defined
</pre>
</div>
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Since the exception was of type <code>NameError</code>, your exception handler didn't match it and the script crashed. You could do a specific <code>NameError</code> handler, but you also have the option of handling any exception that comes along without having to know what it will be ahead of time, by creating an exception handler for type <code>Exception</code>:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;penguins&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;rhinos&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">rhino_count</span> <span class="o">=</span> <span class="n">zoo</span><span class="p">[</span><span class="s1">&#39;rhinos&#39;</span><span class="p">]</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;There are </span><span class="si">{</span><span class="n">rhoni_count</span><span class="si">}</span><span class="s1"> rhinos in our zoo!&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;There are NO rhinos in our zoo!&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Got exception of type </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s1">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Got exception of type &lt;class &#x27;NameError&#x27;&gt;: name &#x27;rhoni_count&#x27; is not defined
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>All exceptions must be subclasses of <code>Exception</code>, so a handler for <code>Exception</code> matches any exception. For this reason, you should always put this handler last, since Python will stop checking the exception handlers once one matches. The <code>except Exception as e:</code> statement assigns the exception object with information about what went wrong to the specified variable name. I'm not a fan of one-letter variable names, but it's very common to assign exceptions to the variable name <code>e</code> so I'm doing so here.</p>
<p></p>
<p>It's up to you how you want to respond to an unexpected exception. You might log information about it to a file, or give the user a message, then you can either continue on or you can choose to let the script crash. To do the latter, simply re-raise the exception like so:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;penguins&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;rhinos&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">rhino_count</span> <span class="o">=</span> <span class="n">zoo</span><span class="p">[</span><span class="s1">&#39;rhinos&#39;</span><span class="p">]</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;There are </span><span class="si">{</span><span class="n">rhoni_count</span><span class="si">}</span><span class="s1"> rhinos in our zoo!&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">KeyError</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;There are NO rhinos in our zoo!&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;Got exception of type </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s1">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Not sure what happened, so it&#39;s not safe to continue -- crashing the script!&quot;</span><span class="p">)</span>
    <span class="k">raise</span> <span class="n">e</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Got exception of type &lt;class &#x27;NameError&#x27;&gt;: name &#x27;rhoni_count&#x27; is not defined
Not sure what happened, so it&#x27;s not safe to continue -- crashing the script!
<div class="div_foreground div_background" style="font-size: normal;" >
<pre class="ansi2html-content">
<span class="ansi31">---------------------------------------------------------------------------</span>
<span class="ansi31">NameError</span>                                 Traceback (most recent call last)
<span class="ansi32">&lt;ipython-input-15-353857cfe4a1&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi1 ansi32">      9</span>     print<span class="ansi34">(</span><span class="ansi34">f'Got exception of type {type(e)}: {e}'</span><span class="ansi34">)</span><span class="ansi34"></span>
<span class="ansi1 ansi32">     10</span>     print<span class="ansi34">(</span><span class="ansi34">"Not sure what happened, so it's not safe to continue -- crashing the script!"</span><span class="ansi34">)</span><span class="ansi34"></span>
<span class="ansi32">---&gt; 11</span><span class="ansi31">     </span><span class="ansi32">raise</span> e<span class="ansi34"></span>

<span class="ansi32">&lt;ipython-input-15-353857cfe4a1&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi1 ansi32">      3</span> <span class="ansi32">try</span><span class="ansi34">:</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      4</span>     rhino_count <span class="ansi34">=</span> zoo<span class="ansi34">[</span><span class="ansi34">'rhinos'</span><span class="ansi34">]</span><span class="ansi34"></span>
<span class="ansi32">----&gt; 5</span><span class="ansi31">     </span>print<span class="ansi34">(</span><span class="ansi34">f'There are {rhoni_count} rhinos in our zoo!'</span><span class="ansi34">)</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      6</span> <span class="ansi32">except</span> KeyError<span class="ansi34">:</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      7</span>     print<span class="ansi34">(</span><span class="ansi34">'There are NO rhinos in our zoo!'</span><span class="ansi34">)</span><span class="ansi34"></span>

<span class="ansi31">NameError</span>: name 'rhoni_count' is not defined
</pre>
</div>
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>In this case, you print a message to the user and then crash the script using <code>raise e</code>. The <code>raise</code> statement is like returning a value from a function, except it instead raises the specified exception (within an exception handler you can <code>raise</code> without specifying an exception and it will automatically raise the same exception that was received, but I recommend the clarity of specifying the exception object).</p>
<p></p>
<p>If you want to handle multiple exceptions in the same handler, you can use a list to specify the exceptions like so:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
    <span class="n">animals</span> <span class="o">=</span> <span class="p">{}</span>
    <span class="n">num</span> <span class="o">=</span> <span class="n">animals</span><span class="p">[</span><span class="s1">&#39;rhino&#39;</span><span class="p">]</span>
<span class="k">except</span> <span class="p">(</span><span class="ne">KeyError</span><span class="p">,</span> <span class="ne">ValueError</span><span class="p">)</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;</span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s1">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
&lt;class &#x27;KeyError&#x27;&gt;: &#x27;rhino&#x27;
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>As you can see, you are in complete control of what happens when an exception is raised. But the story doesn't end there. Now we get to the two most misunderstood features of Python exception handling, <code>else</code> and <code>finally</code> blocks.</p>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3>The else block</h3>
<p>An <code>else</code> block is an optional feature of exception handling that allows you to have a block of code that is only run <i>if no exceptions occurred</i>. Why would you use this? Let's say you are handling exceptions rather than letting the script crash. Here is a situation you can get into if an exception occurs:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;penguins&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">rhino_count</span> <span class="o">=</span> <span class="n">zoo</span><span class="p">[</span><span class="s1">&#39;rhinos&#39;</span><span class="p">]</span>   <span class="c1"># Error: There is no &#39;rhinos&#39; key</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error!&quot;</span><span class="p">)</span>

<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;# of rhinos: </span><span class="si">{</span><span class="n">rhino_count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>   <span class="c1"># Error: Attempting to use a variable that doesn&#39;t exist</span>

<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Continuing...&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Error!
<div class="div_foreground div_background" style="font-size: normal;" >
<pre class="ansi2html-content">
<span class="ansi31">---------------------------------------------------------------------------</span>
<span class="ansi31">NameError</span>                                 Traceback (most recent call last)
<span class="ansi32">&lt;ipython-input-1-24edc757fac9&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi1 ansi32">      6</span>     print<span class="ansi34">(</span><span class="ansi34">"Error!"</span><span class="ansi34">)</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      7</span> <span class="ansi34"></span>
<span class="ansi32">----&gt; 8</span><span class="ansi31"> </span>print<span class="ansi34">(</span><span class="ansi34">f"# of rhinos: {rhino_count}"</span><span class="ansi34">)</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      9</span> <span class="ansi34"></span>
<span class="ansi1 ansi32">     10</span> print<span class="ansi34">(</span><span class="ansi34">"Continuing..."</span><span class="ansi34">)</span><span class="ansi34"></span>

<span class="ansi31">NameError</span>: name 'rhino_count' is not defined
</pre>
</div>
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>In this case, an exception occurred, which kept <code>rhino_count</code> from getting created, but the exception handling kept the script from crashing. I then tried to reference <code>rhino_count</code>, which caused another exception that did crash the script. A classic way of handling this is to create the variable ahead of time and set it to <code>False</code> or zero, then check the value before using it, like so:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;penguins&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>

<span class="n">rhino_count</span> <span class="o">=</span> <span class="kc">False</span>   <span class="c1"># Initializing the variable to a known state.</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">rhino_count</span> <span class="o">=</span> <span class="n">zoo</span><span class="p">[</span><span class="s1">&#39;rhinos&#39;</span><span class="p">]</span>   <span class="c1"># Error: There is no &#39;rhinos&#39; key</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error!&quot;</span><span class="p">)</span>

<span class="k">if</span> <span class="n">rhino_count</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">False</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;# of rhinos: </span><span class="si">{</span><span class="n">rhino_count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>

<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Continuing...&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Error!
Continuing...
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>This approach works, but adds unnecessary code and complexity. The <code>else</code> blocks achieves the same with less code, because if you reach the <code>else</code> block, you know everything is as expected, so you don't have to initialize or check values before using:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;penguins&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">}</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">rhino_count</span> <span class="o">=</span> <span class="n">zoo</span><span class="p">[</span><span class="s1">&#39;rhinos&#39;</span><span class="p">]</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error!&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;No exceptions occurred, # of rhinos: </span><span class="si">{</span><span class="n">rhino_count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>

<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Continuing...&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Error!
Continuing...
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Here's what happens when there are no exceptions:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;penguins&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">12</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;rhinos&#39;</span><span class="p">:</span> <span class="mi">2</span><span class="p">}</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">rhino_count</span> <span class="o">=</span> <span class="n">zoo</span><span class="p">[</span><span class="s1">&#39;rhinos&#39;</span><span class="p">]</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error!&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;No exceptions occurred, # of rhinos: </span><span class="si">{</span><span class="n">rhino_count</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>

<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Continuing...&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
No exceptions occurred, # of rhinos: 2
Continuing...
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>The benefit of an <code>else</code> block is that you can have code that relies on everything going as expected, and can skip that code if something does go wrong. It's completely optional, but is helpful for organizing your code more elegantly.</p>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3>The finally block</h3>
<p>A <code>finally</code> block contains code that will run before the exception handling is exited <i>no matter what happens</i>. That is, whether or not an exception occurs, the code in the <code>finally</code> block will be run. I will emphasize this multiple times because people often take a bit to absorb what this means.</p>
<p></p>
<p>The <code>finally</code> block is usually used for cleanup that needs to occur whether or not an exception occurred.</p>
<p></p>
<p>I'll start with the aspect of exception handling that I learned most recently: You can use a <code>finally</code> block without needing to provide an exception handler. Here is what happens when no exception occurs:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">big_data</span> <span class="o">=</span> <span class="s1">&#39;a&#39;</span> <span class="o">*</span> <span class="mi">100000</span>

<span class="k">try</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">big_data</span><span class="p">))</span>
<span class="k">finally</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Cleaning up!&quot;</span><span class="p">)</span>
    <span class="k">del</span><span class="p">(</span><span class="n">big_data</span><span class="p">)</span>
    
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Continuing...&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
100000
Cleaning up!
Continuing...
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>In this case the <code>try</code> block was executed, there were no exceptions, and the <code>finally</code> block was called before moving on.</p>
<p></p>
<p>If you don't have an exception handler, then any exception will crash the script, but the <code>finally</code> block still gets called before that happens:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">big_data</span> <span class="o">=</span> <span class="s1">&#39;a&#39;</span> <span class="o">*</span> <span class="mi">100000</span>

<span class="k">try</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">bug_data</span><span class="p">))</span>  <span class="c1"># Error: Typo in variable name</span>
<span class="k">finally</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Cleaning up!&quot;</span><span class="p">)</span>
    <span class="k">del</span><span class="p">(</span><span class="n">big_data</span><span class="p">)</span>
    
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Continuing...&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Cleaning up!
<div class="div_foreground div_background" style="font-size: normal;" >
<pre class="ansi2html-content">
<span class="ansi31">---------------------------------------------------------------------------</span>
<span class="ansi31">NameError</span>                                 Traceback (most recent call last)
<span class="ansi32">&lt;ipython-input-10-a52a8a5d09a8&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi1 ansi32">      2</span> <span class="ansi34"></span>
<span class="ansi1 ansi32">      3</span> <span class="ansi32">try</span><span class="ansi34">:</span><span class="ansi34"></span>
<span class="ansi32">----&gt; 4</span><span class="ansi31">     </span>print<span class="ansi34">(</span>len<span class="ansi34">(</span>bug_data<span class="ansi34">)</span><span class="ansi34">)</span>  <span class="ansi31"># Error: Typo in variable name</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      5</span> <span class="ansi32">finally</span><span class="ansi34">:</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      6</span>     print<span class="ansi34">(</span><span class="ansi34">"Cleaning up!"</span><span class="ansi34">)</span><span class="ansi34"></span>

<span class="ansi31">NameError</span>: name 'bug_data' is not defined
</pre>
</div>
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>If you do have an exception handler, then that code will be executed and then the <code>finally</code> block will be executed:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">big_data</span> <span class="o">=</span> <span class="s1">&#39;a&#39;</span> <span class="o">*</span> <span class="mi">100000</span>

<span class="k">try</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">bug_data</span><span class="p">))</span>  <span class="c1"># Error: Typo in variable name</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Error!&quot;</span><span class="p">)</span>
<span class="k">finally</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Cleaning up!&quot;</span><span class="p">)</span>
    <span class="k">del</span><span class="p">(</span><span class="n">big_data</span><span class="p">)</span>
    
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Continuing...&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Error!
Cleaning up!
Continuing...
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>The <code>finally</code> block will be called even if the script is quit -- it is called no matter what happens.</p>
<p></p>
<p>At this point in classes, a student inevitably asks, "Will the finally block be called if..."</p>
<p></p>
<p>Instructor: (Deep breath) "Yes. <i>NO MATTER WHAT HAPPENS</i>."</p>
<p></p>
<p>Got that?</p>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h4>Using exceptions in the finally block</h4>
<p>I felt all good about my knowledge of exceptions, then I ran into a problem that seemed to render the whole thing pointless. If I got an exception while opening a file, and I was using the <code>finally</code> block to make sure the file was closed, I ran into this:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
    <span class="n">myfile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;bogus_path.txt&#39;</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
    <span class="k">pass</span>
<span class="k">finally</span><span class="p">:</span>
    <span class="n">myfile</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
<div class="div_foreground div_background" style="font-size: normal;" >
<pre class="ansi2html-content">
<span class="ansi31">---------------------------------------------------------------------------</span>
<span class="ansi31">NameError</span>                                 Traceback (most recent call last)
<span class="ansi32">&lt;ipython-input-13-fa2cc0bd83d3&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi1 ansi32">      4</span>     <span class="ansi32">pass</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      5</span> <span class="ansi32">finally</span><span class="ansi34">:</span><span class="ansi34"></span>
<span class="ansi32">----&gt; 6</span><span class="ansi31">     </span>myfile<span class="ansi34">.</span>close<span class="ansi34">(</span><span class="ansi34">)</span><span class="ansi34"></span>

<span class="ansi31">NameError</span>: name 'myfile' is not defined
</pre>
</div>
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Because the file was never opened, my attempt to close it failed and my <code>finally</code> block triggered an exception and crashed the script.</p>
<p></p>
<p>This flummoxed me for a while and gave me a dim view of exceptions. Now, presumably there's some convenient way to test whether a variable is defined or not, but before I got to that point I had a revelation: This is what exception handling is all about!</p>
<p></p>
<p>If it might raise an exception but you don't care if it does, just use an empty exception handling within the <code>finally</code> block, like so:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
    <span class="n">myfile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;bogus_path.txt&#39;</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
    <span class="k">pass</span>
<span class="k">finally</span><span class="p">:</span>
    <span class="c1"># myfile may or may not exist, so use an exception handler.</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">myfile</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
    <span class="k">except</span><span class="p">:</span>
        <span class="k">pass</span>
    
<span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Continuing...&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Continuing...
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Now if the file was opened it gets closed, if it wasn't we just move on. This is a perfect expression of the way exception handling solves many problems elegantly.</p>
<p></p>
<p>By knowing what the <code>else</code> and <code>finally</code> blocks do, you've become an elite Python programmer who knows something even many experienced folks don't.</p>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2>Being Pythonic: Using exceptions to improve your code</h2>
<p>That covers the features of exception handling. Now let's talk about the philosophy.</p>
<p></p>
<p>I covered LBYL (Look Before You Leap) above. Now I want to talk about the best part of Python exception handling, the thing that really makes your code Pythonic:</p>
<p></p>
<p><i>EAFP</i>. It's <i>Easier to Ask Forgiveness than Permission</i>.</p>
<p></p>
<h3>Just do it, then handle any errors</h3>
<p>When you think about it, because so much code in the world follows an LBYL model, our logic tends to be inverted. First we do a whole bunch of error checking, and only if everything is good do we then actually do the thing we want to do. This buries the actual logic and makes the less interesting part of the code the most prominent. Here's a typical example:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">json</span>

<span class="k">def</span> <span class="nf">load_project_data</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
    <span class="k">if</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
        <span class="n">data_dict</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;</span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2"> doesn&#39;t exist.&quot;</span><span class="p">)</span>
        <span class="k">return</span>

    <span class="k">if</span> <span class="s1">&#39;project name&#39;</span> <span class="ow">in</span> <span class="n">data_dict</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Project loaded: </span><span class="si">{</span><span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;project name&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Project data badly formatted, missing project name&quot;</span><span class="p">)</span>
        <span class="k">return</span>
    <span class="k">return</span> <span class="n">data_dict</span>

<span class="n">data</span> <span class="o">=</span> <span class="n">load_project_data</span><span class="p">(</span><span class="s1">&#39;data.json&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Project loaded: Manned Mission to Mars
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>The key to EAFP is to stop worrying about getting exceptions. Start with what you actually want to do, and handle errors after if need be. While we could handle specific exceptions, often you can get away with a generic exception handler:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">json</span>

<span class="k">def</span> <span class="nf">load_project_data</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">data_dict</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Project loaded: </span><span class="si">{</span><span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;project name&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">data_dict</span>
    <span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Error while loading </span><span class="si">{</span><span class="n">path</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
        
<span class="n">data</span> <span class="o">=</span> <span class="n">load_project_data</span><span class="p">(</span><span class="s1">&#39;bogus_data.json&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Error while loading bogus_data.json: [Errno 2] No such file or directory: &#x27;bogus_data.json&#x27;
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Less code, and the logic is up front.</p>
<p></p>
<p>Even better and more Pythonic, let the person calling your function deal with any exceptions:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">json</span>

<span class="k">def</span> <span class="nf">load_project_data</span><span class="p">(</span><span class="n">path</span><span class="p">):</span>
    <span class="n">data_dict</span> <span class="o">=</span> <span class="n">json</span><span class="o">.</span><span class="n">load</span><span class="p">(</span><span class="nb">open</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Project loaded: </span><span class="si">{</span><span class="n">data_dict</span><span class="p">[</span><span class="s1">&#39;project name&#39;</span><span class="p">]</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">data_dict</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">data</span> <span class="o">=</span> <span class="n">load_project_data</span><span class="p">(</span><span class="s1">&#39;bogus_data.json&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s2">&quot;Failed to load data: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s2">&quot;</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">data</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Failed to load data: [Errno 2] No such file or directory: &#x27;bogus_data.json&#x27;
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3>Exceptions as a different kind of return value</h3>
<p>Exceptions aren't just for errors! They can be a normal part of structuring code.</p>
<p></p>
<p>As discussed above, exceptions allow for separating errors from return values. They also allow for returning a different kind of value when there is no error. </p>
<p></p>
<p>Python strings demonstrate an example of the old and new way of doing this. Strings have a <code>find()</code> method that returns the index where the substring was found:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">loc</span> <span class="o">=</span> <span class="s1">&#39;Monty Python&#39;</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;P&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">loc</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
6
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>If the substring isn't found, <code>find()</code> returns the special value -1:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">loc</span> <span class="o">=</span> <span class="s1">&#39;Monty Python&#39;</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">loc</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
-1
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>This means you have to look up what -1 means and then check for that specific value, which once again pushes the error checking to the forefront as well as not being the most intuitive code:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">loc</span> <span class="o">=</span> <span class="s1">&#39;Monty Python&#39;</span><span class="o">.</span><span class="n">find</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
<span class="k">if</span> <span class="n">loc</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">loc</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s2">&quot;Substring not found&quot;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Substring not found
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Strings also have an <code>index</code> method that takes the Pythonic approach and simply raises an exception if the substring is not found:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">loc</span> <span class="o">=</span> <span class="s1">&#39;Monty Python&#39;</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="n">loc</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
<div class="div_foreground div_background" style="font-size: normal;" >
<pre class="ansi2html-content">
<span class="ansi31">---------------------------------------------------------------------------</span>
<span class="ansi31">ValueError</span>                                Traceback (most recent call last)
<span class="ansi32">&lt;ipython-input-37-ed5edd6cdd02&gt;</span> in <span class="ansi36">&lt;module&gt;</span><span class="ansi34">()</span>
<span class="ansi32">----&gt; 1</span><span class="ansi31"> </span>loc <span class="ansi34">=</span> <span class="ansi34">'Monty Python'</span><span class="ansi34">.</span>index<span class="ansi34">(</span><span class="ansi34">'a'</span><span class="ansi34">)</span><span class="ansi34"></span>
<span class="ansi1 ansi32">      2</span> print<span class="ansi34">(</span>loc<span class="ansi34">)</span><span class="ansi34"></span>

<span class="ansi31">ValueError</span>: substring not found
</pre>
</div>
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>It might seem extreme to raise an exception just because a substring wasn't found, but that's the point: Exceptions are not always catastrophic, they can be a normal part of control flow:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="k">try</span><span class="p">:</span>
    <span class="n">loc</span> <span class="o">=</span> <span class="s1">&#39;Monty Python&#39;</span><span class="o">.</span><span class="n">index</span><span class="p">(</span><span class="s1">&#39;a&#39;</span><span class="p">)</span>
    <span class="nb">print</span><span class="p">(</span><span class="n">loc</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="s1">&#39;Substring not found&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
Substring not found
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h3>Solving race conditions in error handling</h3>
<p>Sometimes EAFP is the only way.</p>
<p></p>
<p>As mentioned above, <code>os.mkdir()</code> creates a directory, but raises an exception if the directory already exists. </p>
<p>Any guesses what's wrong with this attempt to use LBYL to avoid an exception if the path already exists?</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="s1">&#39;/tmp&#39;</span><span class="p">):</span>
    <span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="s1">&#39;/tmp&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Seems straightforward -- we check to see if the path already exists, and if it doesn't we then proceed to call <code>os.mkdir()</code>.</p>
<p></p>
<p>Add a + to your grade if you spotted the problem: A tiny bit of time passes between the call to <code>os.path.exists()</code> and the subsequent call to <code>os.mkdir()</code>. In that tiny bit of time, someone (maybe even another copy of your script) might have created the <code>/tmp</code> path, in which case you'll get an exception even though you tried to avoid it with the existence check.</p>
<p></p>
<p>This is called a <i>race condition</i>, and it's a terrible bug to have to find. Because 99.9999% of the time everything is going to work fine, but 0.00001% of the time it will fail, and you'll tear your hair out trying to figure out why it never happens on your system but does happen for some of your users.</p>
<p></p>
<p>The only absolutely reliable solution to this race condition is the EAFP approach: Just try making the directory, and if it fails with an OSError exception, then you know the directory already exists at that instant and can move on:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>

<span class="k">try</span><span class="p">:</span>
    <span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="s1">&#39;/tmp&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">OSError</span><span class="p">:</span>
    <span class="k">pass</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2>Be careful about this one weird thing</h2>
<p>I love Python exception handling, and I'm using the techniques discussed above more and more in my code as I fully realize the benefits.</p>
<p></p>
<p>But I have found one little problem popping up with some regularity: If I'm using exception handling to ignore the exception I expect, and then I'm adding some new code to the <code>try</code> block, sometimes the code won't work and I can't figure out why. Then it turns out that an exception was being raised in the new code but was being ignored, so I couldn't see the problem. For example:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>

<span class="k">try</span><span class="p">:</span>
    <span class="c1"># Original code</span>
    <span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="s1">&#39;/tmp&#39;</span><span class="p">)</span>
    
    <span class="c1"># New code that fails because the file doesn&#39;t exist but I don&#39;t see the exception.</span>
    <span class="n">myfile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;/tmp/stuff.txt&#39;</span><span class="p">)</span>
<span class="k">except</span><span class="p">:</span>
    <span class="k">pass</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>To deal with this, when adding new code I've gotten into the habit of printing out what exception occurred, so I can see problems:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">import</span> <span class="nn">os</span>

<span class="k">try</span><span class="p">:</span>
    <span class="c1"># Original code</span>
    <span class="n">os</span><span class="o">.</span><span class="n">mkdir</span><span class="p">(</span><span class="s1">&#39;/tmp&#39;</span><span class="p">)</span>
    
    <span class="c1"># New code that fails because the file doesn&#39;t exist but I don&#39;t see the exception.</span>
    <span class="n">myfile</span> <span class="o">=</span> <span class="nb">open</span><span class="p">(</span><span class="s1">&#39;/tmp/stuff.txt&#39;</span><span class="p">)</span>
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
    <span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;DEBUG: Got exception of type: </span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="p">)</span><span class="si">}</span><span class="s1">: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
    <span class="k">pass</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<h2>References</h2>
<p>My knowledge of the Pythonic approach to exceptions has come from a variety of sources. Here are a couple that stand out (if you know of other good discussions I should link to, please ping me!):</p>
<p></p>
<ul>
<li><a target="_parent" href="https://www.amazon.com/Fluent-Python-Concise-Effective-Programming/dp/1491946008/">Fluent Python, chapter 15, "Content Managers and else blocks"</a></li>
<li><a target="_parent" href="https://www.amazon.com/Effective-Python-Specific-Software-Development/dp/0134034287/">Effective Python, item 14, “Prefer Exceptions to Returning None”</a></li>
</ul>
</div>
</div>]]></content>
    <link href="http://conquerprogramming.com/blog/3-Exceptions.html" rel="alternate"/>
    <summary>Exception handling in Python not only provides a way to respond to errors, it allows you to elegantly structure your code and solve problems, reduces code, and sometimes speeds up your script. Being Pythonic means knowing how to use exceptions to their full extent. I've learned about exceptions from many different sources, each having a particular insight, but I haven't found one write-up that covers it all, so this entry an attempt at that.</summary>
    <published>2019-01-23T12:00:00-08:00</published>
  </entry>
  <entry>
    <id>http://conquerprogramming.com/blog/2</id>
    <title>A Caution about Dictionaries in Python 3.7</title>
    <updated>2019-01-22T12:00:00-08:00</updated>
    <author>
      <name>Ronald Hayden</name>
      <email>ron@conquerprogramming.com</email>
      <uri>http://conquerprogramming.com</uri>
    </author>
    <content type="CDATA"><![CDATA[<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p></p>
<p></p>
<p>I’m on Python 3.7, working on a project where my colleague is on 3.6. This has quickly revealed an issue with dictionaries in 3.7 that causes serious bugs if you’re not aware of the problem and careful about handling it.</p>
<p></p>
<h2>Some background on dictionaries (you can skip this part)</h2>
<p>Dictionaries are the Python class for storing <i>key/value pairs</i>, one of the most useful and fundamental data types, especially in Python. </p>
<p></p>
<p>Since the beginning of recorded programming history, dictionaries have been <i>unordered</i>, meaning they store their data in an effectively random order:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">zoo</span> <span class="o">=</span> <span class="p">{</span><span class="s1">&#39;birds&#39;</span><span class="p">:</span> <span class="mi">10</span><span class="p">,</span> <span class="s1">&#39;lions&#39;</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="s1">&#39;zebras&#39;</span><span class="p">:</span> <span class="mi">5</span><span class="p">,</span> <span class="p">}</span>

<span class="nb">print</span><span class="p">(</span><span class="n">zoo</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
{&#x27;zebras&#x27;: 5, &#x27;lions&#x27;: 1, &#x27;birds&#x27;: 10}
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>To see what order a dictionary stored things in before 3.7, you can use the <code>hash()</code> function, which returns a number that indicates the order in which the object will be stored in on your system:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;zebras: </span><span class="si">{</span><span class="nb">hash</span><span class="p">(</span><span class="s2">&quot;zebras&quot;</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;lions: </span><span class="si">{</span><span class="nb">hash</span><span class="p">(</span><span class="s2">&quot;lions&quot;</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="sa">f</span><span class="s1">&#39;birds: </span><span class="si">{</span><span class="nb">hash</span><span class="p">(</span><span class="s2">&quot;birds&quot;</span><span class="p">)</span><span class="si">}</span><span class="s1">&#39;</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
zebras: -7571377514210983910
lions: 3909911343523984799
birds: 6946887581510362933
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>This is unintuitive, but by storing data this way, dictionaries are extremely fast to search. Unlike a <code>list</code>, which is very slow to search, because Python searches a list by starting at the first item and going through the list until it finds the desired item; for a large list this can take a long time. A dictionary, on the other hand, calls the <code>hash()</code> function for the item, gets that unique number, and effectively jumps right to the spot where it's stored.</p>
<p></p>
<p>When teaching dictionaries to new programmers (and sometimes even to experienced programmers) I've had to spend a lot of time explaining why and how they work the way they do, and imploring people to remember to never rely on the order of items in a dictionary. </p>
<p></p>
<h2>Python 3.7 changed dictionaries to be ordered</h2>
<p>In Python 3.7 dictionaries now remember their order. This is quite a nice feature, and I find myself now using dictionaries even more than I did before, because they act like an ordered list, yet are still extremely fast to search. It also makes them more intuitive and removes one potential source of bugs, where people would write code assuming the dictionary was ordered when it wasn’t.</p>
<p></p>
<h3>The Problem: The people running your script may not be on Python 3.7</h3>
<p>For the last week I've been running into this. I'm working on a script that will be used for a project kickoff, and which makes heavy use of dictionaries being ordered to make the output usable. </p>
<p></p>
<p>Everything works great for me, but when my colleague on 3.6 runs the script, everything is in scrambled order, rendering the output almost useless. This is a very easy bug to run into unless you are also testing your script on a pre-3.7 version of Python.</p>
<p></p>
<h3>One Solution: Use collections.OrderedDict instead</h3>
<p>Based on this experience, I've decided that for the foreseeable future I'm not going to use the built-in dictionary. Instead, the <code>collections</code> module has an <code>OrderedDict</code> class that acts just like a dictionary, but remembers the order no matter what version you are running (even Python 2.7 has this class).</p>
<p></p>
<p>You can't use the dictionary literal (<code>{}</code>) for an OrderedDict, you have to use the class name, after which everything else is the same:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">collections</span> <span class="kn">import</span> <span class="n">OrderedDict</span>

<span class="n">mydict</span> <span class="o">=</span> <span class="n">OrderedDict</span><span class="p">()</span>

<span class="n">mydict</span><span class="p">[</span><span class="s1">&#39;birds&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">5</span>
<span class="n">mydict</span><span class="p">[</span><span class="s1">&#39;lions&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="n">mydict</span><span class="p">[</span><span class="s1">&#39;zebras&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="mi">5</span>

<span class="nb">print</span><span class="p">(</span><span class="n">mydict</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
OrderedDict([(&#x27;birds&#x27;, 5), (&#x27;lions&#x27;, 1), (&#x27;zebras&#x27;, 5)])
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>If you take this approach you still need to be careful: I've found myself unthinkingly using a literal to create a dictionary and having the problem pop up yet again.</p>
<p></p>
<p>Even though I like having my dictionaries be ordered, this kind of change is disruptive enough that it seems like something that should go into a .0 release rather than a dot release, though I suppose that wouldn't really change this impact. In any case, now that this change has happened, be cautious with your use of dictionaries!</p>
</div>
</div>]]></content>
    <link href="http://conquerprogramming.com/blog/2-Python_dictionaries_3_7.html" rel="alternate"/>
    <summary/>
    <published>2019-01-22T12:00:00-08:00</published>
  </entry>
  <entry>
    <id>http://conquerprogramming.com/blog/1</id>
    <title>mydir(): an improved version of dir()</title>
    <updated>2019-01-14T12:00:00-08:00</updated>
    <author>
      <name>Ronald Hayden</name>
      <email>ron@conquerprogramming.com</email>
      <uri>http://conquerprogramming.com</uri>
    </author>
    <content type="CDATA"><![CDATA[<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>I love <code>dir()</code>, I hate <code>dir()</code>.</p>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>One of the first things I teach students, whether new or experienced programmers, is the triad of built in functions critical for figuring things out in Python:</p>
<p></p>
<ol>
<li value="1"><code>type()</code></li>
<li value="2"><code>dir()</code></li>
<li value="3"><code>help()</code></li>
</ol>
<p></p>
<p>Of these, <code>dir()</code> is the function I use more than any other, whether in class or while doing my own programming. It's absolutely critical. And yet it annoys the hell out of me.</p>
<p></p>
<p><i>dir</i> is short for <i>directory</i>, and provides a list of all the names associated with an object in Python, which are the attributes and methods you can use with that object.</p>
<p></p>
<h2>What don't I like about dir()?</h2>
<p></p>
<p>Here's the output of <code>dir()</code> when called on <code>list</code>, one of the early objects I talk about in class:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="nb">print</span><span class="p">(</span><span class="nb">dir</span><span class="p">(</span><span class="nb">int</span><span class="p">))</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
[&#x27;__abs__&#x27;, &#x27;__add__&#x27;, &#x27;__and__&#x27;, &#x27;__bool__&#x27;, &#x27;__ceil__&#x27;, &#x27;__class__&#x27;, &#x27;__delattr__&#x27;, &#x27;__dir__&#x27;, &#x27;__divmod__&#x27;, &#x27;__doc__&#x27;, &#x27;__eq__&#x27;, &#x27;__float__&#x27;, &#x27;__floor__&#x27;, &#x27;__floordiv__&#x27;, &#x27;__format__&#x27;, &#x27;__ge__&#x27;, &#x27;__getattribute__&#x27;, &#x27;__getnewargs__&#x27;, &#x27;__gt__&#x27;, &#x27;__hash__&#x27;, &#x27;__index__&#x27;, &#x27;__init__&#x27;, &#x27;__init_subclass__&#x27;, &#x27;__int__&#x27;, &#x27;__invert__&#x27;, &#x27;__le__&#x27;, &#x27;__lshift__&#x27;, &#x27;__lt__&#x27;, &#x27;__mod__&#x27;, &#x27;__mul__&#x27;, &#x27;__ne__&#x27;, &#x27;__neg__&#x27;, &#x27;__new__&#x27;, &#x27;__or__&#x27;, &#x27;__pos__&#x27;, &#x27;__pow__&#x27;, &#x27;__radd__&#x27;, &#x27;__rand__&#x27;, &#x27;__rdivmod__&#x27;, &#x27;__reduce__&#x27;, &#x27;__reduce_ex__&#x27;, &#x27;__repr__&#x27;, &#x27;__rfloordiv__&#x27;, &#x27;__rlshift__&#x27;, &#x27;__rmod__&#x27;, &#x27;__rmul__&#x27;, &#x27;__ror__&#x27;, &#x27;__round__&#x27;, &#x27;__rpow__&#x27;, &#x27;__rrshift__&#x27;, &#x27;__rshift__&#x27;, &#x27;__rsub__&#x27;, &#x27;__rtruediv__&#x27;, &#x27;__rxor__&#x27;, &#x27;__setattr__&#x27;, &#x27;__sizeof__&#x27;, &#x27;__str__&#x27;, &#x27;__sub__&#x27;, &#x27;__subclasshook__&#x27;, &#x27;__truediv__&#x27;, &#x27;__trunc__&#x27;, &#x27;__xor__&#x27;, &#x27;bit_length&#x27;, &#x27;conjugate&#x27;, &#x27;denominator&#x27;, &#x27;from_bytes&#x27;, &#x27;imag&#x27;, &#x27;numerator&#x27;, &#x27;real&#x27;, &#x27;to_bytes&#x27;]
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>What's wrong with that for students? Let me count the ways...</p>
<p></p>
<ol>
<li value="1">The listing starts with the underscore items, which are items for the implementor of the object that you aren't supposed to use (especially as a new programmer). To make matters worse, underscores come first in the sorting, so <strong>all the items you shouldn't use are listed first</strong> and you have to scan through until you find the first non-underscored item. In this case, you have to skip 62 items to get to the 8 item you can actually use.</li>
</ol>
<p></p>
<ol>
<li value="2">The listing doesn't differentiate between attributes and methods. In <strong>every single class</strong>, students ask, "How do we know which ones are methods and which are attributes?"</li>
</ol>
<p></p>
<ol>
<li value="3">The output is ugly and hard to read, which is particularly offensive for people who are trying to learn to program.</li>
</ol>
<p></p>
<h2>My answer: mydir()</h2>
<p></p>
<p>Eventually I got tired of spending several minutes explaining all these problems to students, and over the years I developed my own version of <code>dir()</code> to address the issues. Seeing me use it, students started asking if they could use it in their own coding. To my surprise, I started finding myself using it when doing development, and I found myself discovering things about objects that I'd never noticed before.</p>
<p></p>
<p>Here's the output of <code>mydir()</code> for a <code>list</code>:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">mydir</span> <span class="kn">import</span> <span class="n">mydir</span>

<span class="n">mydir</span><span class="p">(</span><span class="nb">list</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
list
  11 methods:
    append()
    clear()
    copy()
    count()
    extend()
    index()
    insert()
    pop()
    remove()
    reverse()
    sort()
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Which do you prefer?</p>
<p></p>
<p>This makes things <i>so</i> much nicer for students (and for their instructors...)</p>
<p></p>
<p>If you want to see the private (underscored) items, you can do so:</p>
</div>
</div>
<div class="cell border-box-sizing code_cell rendered">
<div class="input">
<div class="inner_cell">
<div class="input_area">
<div class="highlight"><pre><span></span><span class="n">mydir</span><span class="p">(</span><span class="nb">list</span><span class="p">,</span> <span class="n">private</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</pre></div>

</div>
</div>
</div>
</div>
<div class="output_wrapper">
<div class="output">
<div class="output_area">
<div class="prompt"></div>
<div class="output_subarea output_stream output_stdout output_text">
<pre>
list
  43 methods:
    __add__()
    __contains__()
    __delattr__()
    __delitem__()
    __dir__()
    __eq__()
    __format__()
    __ge__()
    __getattribute__()
    __getitem__()
    __gt__()
    __iadd__()
    __imul__()
    __init__()
    __init_subclass__()
    __iter__()
    __le__()
    __len__()
    __lt__()
    __mul__()
    __ne__()
    __new__()
    __reduce__()
    __reduce_ex__()
    __repr__()
    __reversed__()
    __rmul__()
    __setattr__()
    __setitem__()
    __sizeof__()
    __str__()
    __subclasshook__()
    append()
    clear()
    copy()
    count()
    extend()
    index()
    insert()
    pop()
    remove()
    reverse()
    sort()

  1 classes:
    __class__

  2 attributes:
    __doc__
    __hash__
</pre>
</div>
</div>
</div>
</div>
<div class="inner_cell">
<div class="text_cell_render border-box-sizing rendered_html">
<p>Notice that classes and attributes are separated out from methods.</p>
<p></p>
<h2>Download mydir()</h2>
<p></p>
<p>If you'd like to make use of this, you can get it from github (I may submit it to pypi as a module in the future):</p>
<p></p>
<p><a target="_parent" href="https://github.com/ConquerProgramming1/mydir">mydir() on github</a></p>
<p></p>
<h2>Future plans</h2>
<p>I intend to make some additions:</p>
<p></p>
<ul>
<li>More format options, such as a compact display of the items.</li>
<li>The option to return data instead of automatically printing the items.</li>
<li>Update to use the <a target="_parent" href="https://docs.python.org/3.7/library/inspect.html#module-inspect">inspect module</a>.</li>
</ul>
<p></p>
<p>Suggestions and patches welcome!</p>
</div>
</div>]]></content>
    <link href="http://conquerprogramming.com/blog/1-mydir.html" rel="alternate"/>
    <summary>I love ``dir()``, I hate ``dir()``.</summary>
    <published>2019-01-14T12:00:00-08:00</published>
  </entry>
</feed>
