a friend of mine suggested this, and i thought i should share it with the mailing list.<br>many times when you would want to use list/generator comprehensions, you have to<br>fall back to the old for/append way, because of exceptions. so it may be a good idea
<br>to allow an exception handling mechanism in these language constructs.<br><br>since list comprehensions are expressions, an exceptions thrown inside one means<br>the entire list is discarded. you may want to provide some, at least fundamental,
<br>error handling, like &quot;if this item raises an exception, just ignore it&quot;, or &quot;terminate the<br>loop in that case and return whatever you got so far&quot;.<br><br>the syntax is quite simple:<br><br>&quot;[&quot; &lt;expr&gt; for &lt;expr&gt; in &lt;expr&gt; [if &lt;cond&gt;] [except &lt;exception-class-or-tuple&gt;: &lt;action&gt;] &quot;]&quot;
<br><br>where &lt;action&gt; is be one of &quot;continue&quot; or &quot;break&quot;:<br>* continue would mean &quot;ignore this item&quot;<br>* break would mean &quot;return what you got so far&quot;<br><br>for example:<br>
<br>a = [&quot;i&quot;, &quot;fart&quot;, &quot;in&quot;, &quot;your&quot;, &quot;general&quot;, 5, &quot;direction&quot;, &quot;you&quot;, &quot;silly&quot;, &quot;english&quot;, &quot;kniggits&quot;]<br><br>give me every word that starts with &quot;y&quot;, ignoring all errors
<br>b = [x for x in a if x.startswith(&quot;y&quot;) except: continue]<br># returns [&quot;your&quot;, &quot;you&quot;]<br>

<br>or only AttributeError to be more speciifc<br>b = [x for x in a if x.startswith(&quot;y&quot;) except AttributeError: continue]<br># returns [&quot;your&quot;, &quot;you&quot;]<br><br>and with break<br>
b = [x for x in a if x.startswith(&quot;y&quot;) except AttributeError: continue]<br>
# returns only [&quot;your&quot;] -- we didn't get past the 5<br>
<br>in order to do something like this today, you have to resort to the old way,<br>b = []<br>for x in a:<br>&nbsp;&nbsp;&nbsp; try:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if x.startswith(&quot;y&quot;): <br>&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.append(x)<br>&nbsp;&nbsp;&nbsp; except ...:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pass
<br><br>which really breaks the idea behind list comprehension. <br><br>so it's true that this example i provided can be done with a more complex if condition <br>(first doing hasattr), but it's not always possible, and how would you do it if the error 
<br>occurs at the first part of the expression?<br><br>&gt;&gt;&gt; y = [4, 3, 2, 1, 0, -1, -2, -3]<br>&gt;&gt;&gt; [1.0 / x for x in y except ZeroDivisionError: break]<br>[0.25, 0.333, 0.5, 1.0]<br>&gt;&gt;&gt; [1.0 / x for x in y except ZeroDivisionError: continue]
<br>[0.25, 0.333, 0.5, 1.0, -1.0, -0.5, -0.333]<br><br>again, in this example you can add &quot;if x != 0&quot;, but it's not always possible to tell which<br>element will fail. for example:<br><br>filelist = [&quot;a&quot;, &quot;b&quot;, &quot;c&quot;, &quot;&lt;\\/invalid file name:?*&gt;&quot;, &quot;e&quot;]
<br>openfiles = [open(filename) for filename in filelist except IOError: continue]<br><br>the example is hypothetical, but in this case you can't tell *prior to the exception*<br>that the operation is invalid. the same goes for generator expressions, of course.
<br><br><br><br>&nbsp;-tomer