Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 4.0

Part 14 - Exceptions

Info
titleDefinition: Exception

A mechanism designed to handle runtime errors or other problems (exceptions) inside a computer program.

Exceptions are very important, as they are raised whenever an error occurs in the system. (Or at least they should be.)

Catching Exceptions
Anchor
Catching Exceptions

An exception stops the program if it is not caught.

Code Block
borderStylesolid
titleDivision by Zero
print 1 / 0
No Format
bgColor#D8DDE9
borderStylesolid
titleOutput
System.DivideByZeroException: Attempted to divide by zero.
   at Test.Main(String[] argv)

Which stopped the program.

To handle the situation, exceptions must be caught.
Exceptions are either caught in a try-except statement, a try-ensure statement, or a try-except-ensure statement.
Also, all Exceptions are derived from the simple Exception.

Code Block
borderStylesolid
titletry-except example
import System

try:
    print 1 / 0
except e as DivideByZeroException:
    print "Whoops"
print "Doing more..."
No Format
bgColor#D8DDE9
borderStylesolid
titleOutput
Whoops
Doing more...

This prevents the code from stopping and lets the program keep running even after it would have normally crashed.

There can be multiple except statements, in case the code can cause multiple Exceptions.

Try-ensure is handy if you are dealing with open streams that need to be closed in case of an error.

Code Block
borderStylesolid
titletry-ensure example
import System

try:
    s = MyClass()
    s.SomethingBad()
ensure:
    print "This code will be executed, whether there is an error or not."
No Format
bgColor#D8DDE9
borderStylesolid
titleOutput
This code will be executed, whether there is an error or not.
System.Exception: Something bad happened.
   at Test.Main(String[] argv)

As you can see, the ensure statement didn't prevent the Exception from bubbling up and causing the program to crash.

A try-except-ensure combines the two.

Code Block
borderStylesolid
titletry-except-ensure example
import System

try:
    s = MyClass()
    s.SomethingBad()
except e as Exception:
    print "Problem! $(e.Message)"
ensure:
    print "This code will be executed, whether there is an error or not."
No Format
bgColor#D8DDE9
borderStylesolid
titleOutput
Problem: Something bad happened.
This code will be executed, whether there is an error or not.
Tip
titleRecommendation

If you don't solve the problem in your except statement, use the raise command without any parameters to re-raise the original Exception.

Raising Exceptions
Anchor
Raising Exceptions

There are times that you want to raise Exceptions of your own.

Code Block
borderStylesolid
titleRaising an Exception
import System

def Execute(i as int):
    if i < 10:
        raise Exception("Argument i must be greater than or equal to 10")
    print i

If Execute is called with an improper value of i, then the Exception will be raised.

Tip
titleRecommendation

In production environments, you'll want to create your own Exceptions, even if they are just wrappers around Exception with different names.

Tip
titleRecommendation

Never use ApplicationException.

Exercises
Anchor
Exercises

  1. Think of an exercise

Go on to Part 15 - Functions as Objects and Multithreading