Nick Sieger: Tag exceptions
do what you love
tag:blog.nicksieger.com,2005:Typo
Typo
2007-08-31T16:57:18+00:00
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>