Error Handling
Not all errors can be caught at compile time! Help -- run-time error! What next ? First ideas:
n n
System.out.println() System.err.println() (better than the first)
Good guess but some errors call for corrective action, not just Better: tell someone (not necessarily the user)!
OOP: Exception Handling 1
warning. In general, printing is a bad idea!
Error Handling, cont.
Establish return code convention
n n
0 vs. !0 in C/C++ boolean in Java
Set value of a global variable
n n
Done in many shells. In Java use a public static field in a class.
Raise an exception, catch it, and act
n n
The idea comes from hardware. Modern language support (Java, Python, Lisp, Ada, C++).
OOP: Exception Handling
General Errors and Error Handling
Error must be handled where the occur
n n
One error in a method can be handled very differently in the clients, this is not a good approach. Repeating handling of the same error. Can be extremely hard to debug.
To handle an error detailed information on the error must be
provided.
n n n n
Where did the error occur (class, method, line number) What type of error A good error message Dump of runtime stack? (too much information?)
In object-oriented languages errors are represented by objects.
OOP: Exception Handling 3
How to Handle Errors
Ignore: False alarm just continue. Report: Write a message to the screen or to a log. Terminate: Stop the program execution. Repair: Make changes and try to recover the error.
To be able to repair would be the best. However, often the best
that can be done is the combination of report and terminate.
OOP: Exception Handling
Java's Exception Handling
Exception: An event that occurs during the execution of a
program the disrupts the normal transaction flow.
n
A run-time phenomenon.
Exception handling is part of the language. Exceptions are objects. Exceptions are structured in a class hierarchy. It is not possible to ignore an exceptions (very nice feature).
n
A method defines which exception may occur, the client must anticipate these exceptions, otherwise compile-time error.
It is sometimes possible to recover to a known good state after
an exception was raised.
OOP: Exception Handling 5
Java's Exception Handling, cont.
Javas object-oriented way to handle errors
n n
more powerful, more flexible than using return keywords try, catch, throw, throws, finally.
An exception is an object that describes an erroneous or
unusual situation.
Exceptions are thrown by a program, and may be caught and
handled by another part of the program. A program can therefore be separated into a normal execution flow and an exception execution flow. An error is also represented as an object in Java, but usually represents a unrecoverable situation and should not be caught.
OOP: Exception Handling
Motivation for Exception Handling
readFile { errorCodeType readFile { try { initialize errorCode = 0; open the file; open the file; determine its size; if (theFileIsOpen) { allocate that much memory; determine the length of the file; read the file into memory; if (gotTheFileLength) { close the file; allocate that much memory; } catch (fileOpenFailed) { if (gotEnoughMemory) { doSomething; read the file into memory; } catch (sizeDeterminationFailed) { if (readFailed) { doSomething; errorCode = -1; } catch (memoryAllocationFailed) { } doSomething; } else { } catch (readFailed) { errorCode = -2; doSomething; } } catch (fileCloseFailed) { } else { doSomething; errorCode = -3; } } } close the file; if (theFileDidntClose && errorCode == 0) { errorCode = -4; } else { errorCode = errorCode and -4; } } else { errorCode = -5; [source: java.sun.com] } 7 OOP: Exception Handling return errorCode;
Exception Handling Model
Code where you anticipate a problem:
n n
detect error, probably with an if create a new exception and throw it or let JVM detect error, create and throw an exception
public static void main (String args[]) throws exception1, exception2, exception3 { . . . }
Code in client (somewhere in message invocation stack)
n n
try, hoping for the best prepare to catch an exception
try { // statements that can throws exceptions... } catch ( exception1 ) { // do stuff } catch ( exception2 ) { // do stuff }
OOP: Exception Handling
Java's Catch or Specify Requirement
Catch
n
A method can catch exception by providing and exception handler.
Specify
n n
If a method chooses not to catch, then specify which exceptions are thrown. Exceptions are part of a method's public interface.
OOP: Exception Handling
Checked/Unchecked Exceptions
An exception is either checked or unchecked
n
Checked = checked by the compiler
A checked exception can only be thrown within a try block or
within a method that is designated to throw that exception.
n
The compiler will complain if a checked exception is not handled appropriately.
An unchecked exception does not require explicit handling,
though it could be processed that way.
n
An an example many run-time exceptions are unchecked exceptions.
OOP: Exception Handling
10
Exception Class Hierarchy
Checked Checked
Unchecked (System and JVM Errors)
Unchecked
OOP: Exception Handling
11
Exception Hierarchy, cont.
Throwable
n n
Superclass for all exceptions Two methods for filling in and printing the stack Serious internal errors (should not occur in running programs). Are normally not handled. (report and terminate) Programs should not throw Error The catch or specify principle does not apply, because they are so severe. Examples
u u u
Error
n n n n n
Dynamic linking failure Memory shortage Instantiating abstract class
OOP: Exception Handling
12
Exception Hierarchy, cont.
RuntimeException
n n n
Not a good name (all exceptions are at run-time)! Commonly seen run-time error The catch or specify principle does not apply, because they are so ubiquitous. Examples
u
Divide by zero/Cast error/Null pointer
IOException
n n n
Related to input and output The catch or specify principle does apply Examples
u u
File does not exist End of file
OOP: Exception Handling
13
The try Statement
To process an exception when it occurs, the line that throws the
exception is executed within a try block. A try block is followed by one or more catch clauses, which contain code to process an exception. Each catch clause has an associated exception type.
try { // statements }
OOP: Exception Handling
14
The catch Statement
The catch statement is used for catching exceptions. A try statement must be accompanied by a catch statement. Try and catch statements can be nested, i.e., try block in try
block, etc.
try { . . . } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught first " + e.getMessage()); } catch (IOException e) { System.err.println("Caught second " + e.getMessage()); }
OOP: Exception Handling
15
The catch Statement, cont.
When an exception occurs, processing continues at the first
catch clause that matches the exception type. The catch statements should be should be listed in most-specialized-exception-first order.
try { . . . } catch (Exception e) { // very general exception System.err.println("Caught first " + e.getMessage()); } catch (ArrayIndexOutOfBoundsException e) { // will never be called System.err.println("Caught second " + e.getMessage()); }
OOP: Exception Handling
16
The finally Clause
A try statement can have an optional clause designated by the
reserved word finally.
If no exception is generated, the statements in the finally clause
are executed after the statements in the try block complete.
Also, if an exception is generated, the statements in the finally
clause are executed after the statements in the appropriate catch clause complete.
try { // statements that throw exceptions } catch( <exception>) { // do stuff } finally { // code here runs whether or not catch runs }
OOP: Exception Handling 17
The finally Clause, Example
try { out = new PrintWriter(new FileWriter("out.txt")); // statements that throws exceptions } catch (ArrayIndexOutOfBoundsException e) { System.err.println("Caught array error"); } catch (IOException e) { System.err.println("Caught I/O error"); } finally { if (out != null) { System.out.println("Closing file); out.close(); } } }
OOP: Exception Handling
18
The throw Statement
All Java methods use the throw statement to throw an
exception.
public Object pop() throws EmptyStackException { Object obj; if (size == 0) throw new EmptyStackException(); obj = objectAt(size 1); setObjectAt(size - 1, null); size--; return obj;
} [source: java.sun.com]
OOP: Exception Handling
19
Exception Propagation
If it is not appropriate to handle the exception where it occurs,
it can be handled at a higher level. Exceptions propagate up through the method calling hierarchy until they are caught and handled or until they reach the outermost level. A try block that contains a call to a method in which an exception is thrown can be used to catch that exception.
OOP: Exception Handling
20
Exception Propagation, Example
void method1 throws IOException { throw new IOException("Error in method1"); } void method2 throws IOException { // do stuff, but no catch, just specify method1(); } void method3 throws IOException { // do stuff, but no catch, just specify method2(); } public static void main (String args[]){ // catch if just specify error to console try { method3(); } catch (IOException e){ // handle the exception from method1 } }
OOP: Exception Handling 21
Rethrowing an Exception
void method1 throws IOException { throw new IOException("Error in method1"); } void method2 throws IOException { try{ method1(); } catch (IOException e) { System.out.printly ("Handle partly here"); throw e; // 1 st method // throw e.fillInStackTrace; // 2nd method // throw new IOException ("new one"); // 3th method } } public static void main (String args[]){ // catch if just specify error to console try { method2(); } catch (IOException e){ System.out.printly ("Handle rest here"); } OOP: Exception Handling }
22
Creating New Exceptions
Requires careful design (part of the public interface). Can an existing Exception be used? Choose the correct superclass. Choosing the name
n n
The most important thing for new exceptions. Tends to be long an descriptive (ArrayIndexOutOfBoundsException)
Code for exception class typically minimal Naming convention:
n n
All classes that inherits from Exception has 'Exception' postfixed to their name. All classes that inherits from Error has 'Error' postfixed to their name.
23
OOP: Exception Handling
Creating New Exceptions, Example
class SimplestException extends Exception { // empty method body, give it a good name } class SimpleException extends Exception { SimpleException () { super(); } // default constructor SimpleException (String str) { super(str); } } class ExtendedException extends Exception { private static int counter = 0; private int instanceNo = 0; ExtendedException () { super(); counter++; } ExtendedException (String str) { super(str); counter++; } ExtendedException (String str, int no) { instanceNo = no; counter++; super(str); } }
OOP: Exception Handling 24
Inheritance and Exceptions
If base-class method throws an exception, derived-class method
may throw that exception or one derived from it.
Derived-class method cannot throw an exception that is not a
type/subtype of an exception thrown by the base-class method.
OOP: Exception Handling
25
Guidelines
Do not use exceptions for normal control flow! Do use exceptions to indicate abnormal conditions! Handle the error (fully or partially) if you have enough
information in the current context. Otherwise, propagate! Handle group of statements
n
Do not encompass every single statement in a try block
Use exceptions in constructors! Do something with the exceptions your code catches! Clean up using finally.
OOP: Exception Handling
26
Summary
The manner in which an exception is processed is an important
design consideration.
Advantages of Exceptions
n n
Separates error handling from "regular" code. Propagation of errors up the call stack.
u
Handle error in a context Overview Reuse of error handling code
Grouping of error type and differentiation of errors.
u u
OOP: Exception Handling
27