Nick Sieger: Ruby's Exception Hierarchy
do what you love
tag:blog.nicksieger.com,2005:Typo
Typo
2007-08-31T16:57:19+00:00
g
urn:uuid:f86a9b45-c959-4943-976c-df240d9bcbd1
2006-10-20T21:38:39+00:00
2007-08-31T16:57:19+00:00
Comment on Ruby's Exception Hierarchy by g
<p>this will give best of both worlds :)</p>
<p>unless ARGV[0] #option to output errors</p>
<p>next if cls.superclass == SystemCallError # avoid dumping Errno’s</p>
<p>end</p>
Nick
urn:uuid:e52b552e-d3cd-432a-8899-ffd8874614f6
2006-09-11T14:04:35+00:00
2007-08-31T16:57:19+00:00
Comment on Ruby's Exception Hierarchy by Nick
<p>Thanks for the link. Yes, I did omit Errno::* for brevity’s sake.</p>
Eric Hodel
urn:uuid:30d0cf13-a535-4bc8-a5a0-63c4d293e098
2006-09-11T04:38:03+00:00
2007-08-31T16:57:19+00:00
Comment on Ruby's Exception Hierarchy by Eric Hodel
<p>Its in the <a href='http://www.zenspider.com/Languages/Ruby/QuickRef.html' rel="nofollow">Ruby Quickref</a> under <a href='http://www.zenspider.com/Languages/Ruby/QuickRef.html#34' rel="nofollow">Exceptions, Catch and Throw</a>.</p>
<p>PS: You forgot Errno::*</p>
Nick Sieger
urn:uuid:c9ee0150-b97e-4d4f-9817-0bba620d0624
2006-09-06T20:16:00+00:00
2007-08-31T16:57:18+00:00
Ruby's Exception Hierarchy
<p><a href="http://www.tbray.org/ongoing/When/200x/2006/09/05/What-Ruby-Needs">Tim Bray</a>:</p>
<blockquote>
<p>Today I needed to know the class hierarchy under Exception, and
maybe it’s there online but I couldn’t find it. Blecch. Hint:
Pickaxe, 2nd ed., page 462.</p>
</blockquote>
<p>Well, you could always use Ruby itself, too, that way you’ll always have an up-to-date list:</p>
<div class="typocode"><pre><code class="typocode_ruby "><span class="ident">exceptions</span> <span class="punct">=</span> <span class="punct">[]</span>
<span class="ident">tree</span> <span class="punct">=</span> <span class="punct">{}</span>
<span class="constant">ObjectSpace</span><span class="punct">.</span><span class="ident">each_object</span><span class="punct">(</span><span class="constant">Class</span><span class="punct">)</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">cls</span><span class="punct">|</span>
<span class="keyword">next</span> <span class="keyword">unless</span> <span class="ident">cls</span><span class="punct">.</span><span class="ident">ancestors</span><span class="punct">.</span><span class="ident">include?</span> <span class="constant">Exception</span>
<span class="keyword">next</span> <span class="keyword">if</span> <span class="ident">exceptions</span><span class="punct">.</span><span class="ident">include?</span> <span class="ident">cls</span>
<span class="keyword">next</span> <span class="keyword">if</span> <span class="ident">cls</span><span class="punct">.</span><span class="ident">superclass</span> <span class="punct">==</span> <span class="constant">SystemCallError</span> <span class="comment"># avoid dumping Errno's</span>
<span class="ident">exceptions</span> <span class="punct"><<</span> <span class="ident">cls</span>
<span class="ident">cls</span><span class="punct">.</span><span class="ident">ancestors</span><span class="punct">.</span><span class="ident">delete_if</span> <span class="punct">{|</span><span class="ident">e</span><span class="punct">|</span> <span class="punct">[</span><span class="constant">Object</span><span class="punct">,</span> <span class="constant">Kernel</span><span class="punct">].</span><span class="ident">include?</span> <span class="ident">e</span> <span class="punct">}.</span><span class="ident">reverse</span><span class="punct">.</span><span class="ident">inject</span><span class="punct">(</span><span class="ident">tree</span><span class="punct">)</span> <span class="punct">{|</span><span class="ident">memo</span><span class="punct">,</span><span class="ident">cls</span><span class="punct">|</span> <span class="ident">memo</span><span class="punct">[</span><span class="ident">cls</span><span class="punct">]</span> <span class="punct">||=</span> <span class="punct">{}}</span>
<span class="keyword">end</span>
<span class="ident">indent</span> <span class="punct">=</span> <span class="number">0</span>
<span class="ident">tree_printer</span> <span class="punct">=</span> <span class="constant">Proc</span><span class="punct">.</span><span class="ident">new</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">t</span><span class="punct">|</span>
<span class="ident">t</span><span class="punct">.</span><span class="ident">keys</span><span class="punct">.</span><span class="ident">sort</span> <span class="punct">{</span> <span class="punct">|</span><span class="ident">c1</span><span class="punct">,</span><span class="ident">c2</span><span class="punct">|</span> <span class="ident">c1</span><span class="punct">.</span><span class="ident">name</span> <span class="punct"><=></span> <span class="ident">c2</span><span class="punct">.</span><span class="ident">name</span> <span class="punct">}.</span><span class="ident">each</span> <span class="keyword">do</span> <span class="punct">|</span><span class="ident">k</span><span class="punct">|</span>
<span class="ident">space</span> <span class="punct">=</span> <span class="punct">('</span><span class="string"> </span><span class="punct">'</span> <span class="punct">*</span> <span class="ident">indent</span><span class="punct">);</span> <span class="ident">space</span> <span class="punct">||=</span> <span class="punct">'</span><span class="string"></span><span class="punct">'</span>
<span class="ident">puts</span> <span class="ident">space</span> <span class="punct">+</span> <span class="ident">k</span><span class="punct">.</span><span class="ident">to_s</span>
<span class="ident">indent</span> <span class="punct">+=</span> <span class="number">2</span><span class="punct">;</span> <span class="ident">tree_printer</span><span class="punct">.</span><span class="ident">call</span> <span class="ident">t</span><span class="punct">[</span><span class="ident">k</span><span class="punct">];</span> <span class="ident">indent</span> <span class="punct">-=</span> <span class="number">2</span>
<span class="keyword">end</span>
<span class="keyword">end</span>
<span class="ident">tree_printer</span><span class="punct">.</span><span class="ident">call</span> <span class="ident">tree</span></code></pre></div>
<pre><code>Exception
NoMemoryError
ScriptError
LoadError
NotImplementedError
SyntaxError
SignalException
Interrupt
StandardError
ArgumentError
IOError
EOFError
IndexError
LocalJumpError
NameError
NoMethodError
RangeError
FloatDomainError
RegexpError
RuntimeError
SecurityError
SystemCallError
SystemStackError
ThreadError
TypeError
ZeroDivisionError
SystemExit
fatal
</code></pre>
<p>Results also entered into <a href="http://cheat.errtheblog.com/s/exceptions">cheat</a>; <code>sudo gem install cheat --source require.errtheblog.com; cheat exceptions</code>
for future reference.</p>