title: Why must a type thrown or caught derive from System.Exception
body: <p>So just out of curiosity I wanted to see what was special about the exception class that allowed it to be used with the keyword <code>Throw</code> while a standard class is not.</p>
  
  <p>All I found is that the Exception class implemented the following</p>
  
  <pre><code>public class Exception : System.Object, System.Runtime.Serialization.ISerializable, System.Runtime.InteropServices._Exception
  {
  }
  </code></pre>
  
  <p>So I tried implementing those same interfaces and attempting to throw my own custom exception that did not derive from <code>System.Exception</code> to no avail. I was simply advised that </p>
  
  <blockquote>
    <p>The type caught or thrown must be derived from <code>System.Exception</code></p>
  </blockquote>
  
  <p>So is there any specific reason for this? I assume there is as few choices in managed languages seem to be arbitrary. </p>