Exception handling syntax varies between programming languages to accommodate their overall syntax. Some languages don't call the concept exception handling or they may not have direct facilities for it, but they can still provide means for implementing it.
Catalogue of exception handling syntaxes
Exception declarations
Some_Error : exception;
Raising exceptions
raise Some_Error;
raise Some_Error with "Out of memory"; -- specific diagnostic message
Exception handling and propagation
with Ada.Exceptions, Ada.Text_IO;
procedure Foo is
Some_Error : exception;
begin
Do_Something_Interesting;
exception -- Start of exception handlers
when Constraint_Error =>
... -- Handle constraint error
when Storage_Error =>
-- Propagate Storage_Error as a different exception with a useful message
raise Some_Error with "Out of memory";
when Error : others =>
-- Handle all others
Ada.Text_IO.Put("Exception: ");
Ada.Text_IO.Put_Line(Ada.Exceptions.Exception_Name(Error));
Ada.Text_IO.Put_Line(Ada.Exceptions.Exception_Message(Error));
end Foo;
ON ERROR GOTO handler
OPEN "Somefile.txt" FOR INPUT AS #1
CLOSE #1
PRINT "File opened successfully"
END
handler:
PRINT "File does not exist"
END
public static void Main()
{
try
{
// Code that could throw an exception
}
catch(System.Net.WebException exp)
{
//Process a WebException
}
catch(System.Exception)
{
//Process a System level CLR exception, that is not a System.Net.WebException
//since the exception has not been given an identifier it cannot be referenced
}
catch
{
//Process a non-CLR exception
}
finally
{
// (optional) code that will *always* execute
}
}
#include <exception>
int main() {
try {
// do something (might throw an exception)
}
catch (const std::exception& e) {
// handle exception e
}
catch (...) {
// unknown exception, should not happen
}
}
In C++, a resource acquisition is initialization technique can be used to clean up resources in exceptional situations.
import std.stdio; // for writefln()
int main() {
try {
// do something that might throw an exception
}
catch (FooException e) {
// handle exceptions of type FooException
}
catch (Object o) {
// handle any other exceptions
writefln("Unhandled exception: ", o);
return 1;
}
return 0;
}
In D, a finally clause or the resource acquisition is initialization technique can be used to clean up resources in exceptional situations.
try { // Normal execution path } catch (ExampleException ee) { // deal with the ExampleException } finally { // This optional section is executed upon termination of any of the try or catch blocks above }
Exception declarations
NSException *exception = [NSException exceptionWithName:@"myException" reason:@"whatever" userInfo:nil];
Raising exceptions
@throw exception;
Exception handling and propagation
@try { ... } @catch (SomeException *se) { // Handle a specific exception type. ... } @catch (NSException *ne) { // Handle general exceptions. ... // Propagate the exception so that it's handled at a higher level. @throw; } @catch (id ue) { // Catch all thrown objects. ... } @finally { // Perform cleanup, whether an exception occurred or not. ... }
begin # Do something nifty raise SomeError, "This is the error message!" # Uh-oh! rescue SomeError # This is executed when a SomeError exception # is raised rescue AnotherError => error # Here, the exception object is referenced from the # `error' variable else # This is executed only if no exceptions were raised ensure # This is always executed, exception or not end
f = None try: f = file("aFileName") f.write(could_make_error()) except IOError: print "Unable to open file" except: # catch all exceptions print "Unexpected error" finally: # clean-up actions if f: f.close()
exception MyException of string * int (* exceptions can carry a value *) let _ = try raise (MyException ("not enough food", 2)); print_endline "Not reached" with | MyException (s, i) -> Printf.printf "MyException: %s, %d\n" s i | _ -> (* catch all exceptions *) print_endline "Unexpected exception"
The most common way to implement exception handling in standard C is to use setjmp/longjmp functions:
#include <setjmp.h> #include <stdio.h> enum { SOME_EXCEPTION = 1 }; jmp_buf state; int main() { int exception; if((exception = setjmp(state)) == 0) // try { if(/* something happened */) longjmp(state, SOME_EXCEPTION); // throw SOME_EXCEPTION } else switch(exception) { case SOME_EXCEPTION: // catch SOME_EXCEPTION puts("SOME_EXCEPTION caught"); break; default: // catch ... puts("Some strange exception"); } return 0; }
Some operating systems also have similar features, for example Microsoft Windows has "Structured Exception Handling" (SEH):
int filterExpression (EXCEPTION_POINTERS* ep) { ++ep->ContextRecord->Eip; return EXCEPTION_CONTINUE_EXECUTION; } int main() { static int zero; __try { zero = 1/zero; printf ("Past the exception.\n"); } __except (filterExpression (GetExceptionInformation())) { printf ("Handler called.\n"); } return 0; }
- see also Vectored Exception Handling (VEH).
eval { # Code that could throw an exception (using 'die') }; if($@){ # Handle exception here. (The exception object is in $@) }
// Exception handling is only available in PHP versions 5 and greater. == try == try { ... // Code which might throw an exception } catch (FirstExceptionClass $exception) { ... // Code which handles this exception } catch (SecondExceptionClass $exception) { // you get the idea what i mean ;) }
(php5powerprogramming: ISBN 0-13-147149-X, page 77)
try try // Code which may raise an exception except on E:Exception do // Code to call when an exception is raised end; finally // Code which will be executed whether or not an exception is raised (e.g. clean-up code) end;
try for 30 minutes cd /tmp rm -f data forany host in xxx yyy zzz wget http://${host}/fresh.data data end end
try { // Statements in which exceptions might be thrown } catch(error) { // Statements that execute in the event of an exception } finally { // Statements that execute afterward either way }
See also
- Exception handling for the semantics of exception handling
- Syntax for definition of syntax in computer science