Click here to Skip to main content
Licence CPOL
First Posted 11 Oct 2006
Views 19,968
Bookmarked 7 times

Not All Exceptions Are Errors

By | 11 Oct 2006 | Article
Not all exceptions are errors. Many developers have incorrectly been taught or assume that all exceptions are errors. In fact, a key clue is that they are called exceptions and not errors.

Introduction

Not all exceptions are errors. Many developers have incorrectly been taught or assume that all exceptions are errors. In fact, a key clue is that they are called exceptions and not errors.

Dictionary.com defines an exception as something excepted; an instance or case not conforming to the general rule. Exceptions in code are used to modify standard program flow (i.e. the general rule) and communicate information to a higher calling level where they are trapped.

.NET, Delphi, C++ and Java all treat exceptions with the same rule and many code bases use exceptions for many tasks other than to signal errors. While signalling error conditions is the most common use of exceptions, it is not the only proper use. If errors were the only proper use, we would use the older term that Visual Basic and others used of error handling, instead of exception handling.

Exceptions

Exceptions can also be used to return status information. Imagine a large framework where the call stack is very deep, yet you need to exit out to the root and communicate some condition such as a cancel request from a user.

Should you modify each and every possible method that this can occur in? Doing so would require adding additional flags to each and every method signature possibly even as a reference argument, or creating a global flag in a static. Neither are good approaches. Just imagine how many if statements this would require and the impact to the code in additional complexity and noise.

Imagine the following call stack:

Button1Click
DoSomething
DoSomethingElse
DoSomethingDeeper

Which is better? Modifying all three called methods to pass back a flag the user has cancelled? Or simply throw a typed exception in DoSomethingDeeper and let Button1Click catch it? Using an exception also allows generic resuse by any caller without imposing any abnormal prerequisites.

A cancel exception can be defined and easily thrown from anywhere. This exception is easily caught from the calling code, and has no impact on altering any other code to check for global flags or passed reference arguments. It also handles all program flow properly. If code needs to react to this condition, it can trap and then rethrow the exception. If you have already built in proper exception handling code for errors, usually the same code applies.

But is the user requesting a cancel operation and error? No. But it is an exception. There are many more examples of such behaviour. NUnit uses such exceptions, as does Indy Sockets (Connection closed gracefully), and Delphi's RTL (EAbort).

And Errors?

Errors are things that we do try to prevent, while exceptions may occur on purpose. Errors are things like "Not enough disk space", "Out of memory", "Cannot reach server".

Errors are things that can happen, but do not occur intentionally except during testing. Errors occur when something is wrong, but exceptions can occur also when things are correct but need "exceptional" attention. Think of an exception like an interrupt in hardware. Interrupts are used for error conditions as well, but they are also used to signal network activity, the reset button, and more.

Proceed Slowly

Just because exceptions can be used for signalling something, their main purpose is altering normal program flow. They should not be used as general purpose signalling mechanisms. Exceptions themselves should be used as the exception, not the rule.

Throwing an exception is costly, relatively speaking. Exceptions are not fast mechanisms, nor need they be. You should not throw exceptions inside a loop, unless the exception also causes an exit of the loop. However used in a context such as a user cancelling processing, the overhead is one time and insignificant. In such cases, an exception will still be far faster than executing additional logic code you would have to write.

If the function is an endpoint function and an "exception" is likely, you can implement it like TryParse. However this only works for endpoint functions, not in examples like the user cancel scenario.

History

  • 11th October, 2006: Initial post

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Chad Z. Hower aka Kudzu

Other

Cyprus Cyprus

Member

Chad Z. Hower, a.k.a. Kudzu
"Programming is an art form that fights back"
Website: http://www.KudzuWorld.com
Blogspace: http://www.KudzuWorld.com/blogs/
Speaking Profile: http://www.woo-hoo.net/
 
Formerly the Regional Developer Adviser (DPE) for Microsoft MEA (Middle East and Africa), he was responsible for 85 countries spanning 4 continents and crossing 10 time zones. Now Chad is Microsoft MVP and a professional speaker at popular developer conferences worldwide. Chad was once introduced as having "mastered more languages than a United Nations translator." Chad is the author of the book Indy in Depth and has contributed to several other books on network communications and general programming. Chad has lived in Canada, Cyprus, Switzerland, France, Jordan, Russia, Turkey, and the United States. In total Chad has visited more than 50 countries, visiting most of them many times.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralMy vote of 5 PinmemberSAKryukov15:01 26 Jan '11  
GeneralMy vote of 1 Pinmemberkane6:56 10 Jul '09  
GeneralRe: My vote of 1 PinmemberThoits8:37 19 Mar '10  
GeneralRe: My vote of 1 PinmemberThoits11:32 19 Mar '10  
GeneralInteresting Pinmemberreinux4:41 11 Oct '06  
GeneralRe: Interesting PinmemberChad Z. Hower aka Kudzu5:10 11 Oct '06  
GeneralRe: Interesting PinmemberSAKryukov16:14 26 Jan '11  
GeneralSignalling via an Exception is bad PinmemberAlois Kraus2:32 11 Oct '06  
GeneralRe: Signalling via an Exception is bad PinmemberChad Z. Hower aka Kudzu2:39 11 Oct '06  
GeneralRe: Signalling via an Exception is bad PinmemberChad Z. Hower aka Kudzu5:07 11 Oct '06  
GeneralRe: Signalling via an Exception is bad PinmemberAlois Kraus12:16 11 Oct '06  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web03 | 2.5.120517.1 | Last Updated 11 Oct 2006
Article Copyright 2006 by Chad Z. Hower aka Kudzu
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid