If you look at the type of `error`, `assert`, or `undefined` (or `throw`, also defined in Control.Exception) you&#x27;ll see that they actually don&#x27;t show up in the type:<p><pre><code>    Prelude&gt; :t error
    error :: [Char] -&gt; a
    Prelude&gt; :t undefined
    undefined :: t
    Prelude&gt; :t assert
    assert :: Bool -&gt; a -&gt; a
    Prelude Control.Exception&gt; :t throw
    throw :: Exception e =&gt; e -&gt; a
</code></pre>
This means you can throw from anywhere.  You can only <i>catch</i> in IO.