A while ago, Eric Lippert wrote an excellent blog entry called Vexing Exceptions. He defines four categories of exceptions, along with recommendations of how to handle them. I summarized this information into a Word document which I’ve printed out and posted at my desk:


I’ve also started to use Mr. Lippert’s terminology in my regular work, and I see it becoming more common in the programming communities. A brief summary of the terminology is below:

  • Fatal - exceptions that you can’t prevent and cannot handle in a reasonable manner, e.g., out of memory, thread aborted.
  • Boneheaded - exceptions that are bugs in the code, e.g., argument null, index out of range.
  • Vexing - exceptions thrown in non-exceptional situations, e.g., parsing errors.
  • Exogenous - exceptions due to external influences, e.g., file not found.

The question of what exactly constitutes a “non-exceptional situation” is not addressed; this is an age-old debate.

Eric Lippert’s post is mainly concerned with client-side code; that is, how to handle the different exception categories. When I write code, I always strive to write it as if it were going to be a library (I find that a little thought about API design goes a long way towards code reusability, even if the code never becomes an actual library). Therefore, in my Word document, I added design recommendations for each exception category as well.