|
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 syntaxesAdaException declarations
Some_Error : exception;
Raising exceptionsraise Some_Error; raise Some_Error with "Out of memory"; -- specific diagnostic message Exception handling and propagationwith 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; BASICON ERROR GOTO handler OPEN "Somefile.txt" FOR INPUT AS #1 CLOSE #1 PRINT "File opened successfully" END handler: PRINT "File does not exist" END CThe 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; }
C#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 } } C++#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. Dimport 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 Delphitry 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; Erlang
try
% some dangerous code
catch
throw:{someError, X} -> ok; % handle an exception
error:X -> ok; % handle another exception
_:_ -> ok % handle all exceptions
after
% clean up
end
Fault Tolerant Shell
try for 30 minutes
cd /tmp
rm -f data
forany host in xxx yyy zzz
wget http://${host}/fresh.data -O data
end
end
HaskellHaskell does not have special syntax for exception handling, because throwing an exception can be realized generically as a monad. However, the function
do {
-- Statements in which errors might be thrown
} `catch` \ex -> do {
-- Statements that execute in the event of an exception, with 'ex' bound to the exception
}
In purely functional code, if only one error condition exists, the Javatry { // 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 } JavaScripttry { // 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 } Common Lisp(ignore-errors (/ 1 0)) (handler-case (progn (print "enter an expression") (eval (read))) (error (e) (print e))) Objective-CException declarationsNSException *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. ... } OCamlexception 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" PerlThe Perl mechanism for exception handling uses eval { # Code that could throw an exception (using 'die') open(FILE, $file) || die "Could not open file: $!"; while (<FILE>) { process_line($_); } close(FILE) || die "Could not close $file: $!"; }; if ($@) { # Handle exception here. The exception string is in $@ } Perl 5.005 added the ability to throw objects as well as strings. This allows for better introspection and handling of types of exceptions. eval { open(FILE, $file) || die MyException::File->new($!); while (<FILE>) { process_line($_); } close(FILE) || die MyException::File->new($!); }; if ($@) { # The exception object is in $@ if ($@->isa('MyException::File')) { # Handle file exception } else { # Generic exception handling # or re-throw with 'die $@' } } The local $SIG{__DIE__} = sub { my $err = shift; if ($err->isa('MyException')) { die $err; # re-throw } else { # Otherwise construct a MyException with $err as a string die MyException::Default->new($err); } }; A number of modules in CPAN expand on the basic mechanism:
PHP// Exception handling is only available in PHP versions 5 and greater. 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) PowerBuilderException handling is available in PowerBuilder versions 8.0 and above. 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 END TRY Pythonf = None try: f = file("aFileName") f.write(could_make_error()) except IOError: print "Unable to open file" except: # catch all exceptions print "Unexpected error" else: # executed if no exceptions are raised print "File write completed successfully" finally: # clean-up actions, always executed if f: f.close() REBOL
REBOL [
Title: "Exception and error handling examples"
]
; TRY a block; capturing an error! and converting to object!
if error? exception: try [1 / 0][probe disarm exception]
; ATTEMPT results in the value of the block or the value none on error
print attempt [divide 1 0]
; User generated exceptions can be any datatype!
example: func ["A function to throw an exception"
][
throw "I'm a string! exception"
]
catch [example]
; User generated exceptions can also be named,
; and functions can include additional run time attributes
sophisticated: func ["A function to throw a named error exception"
[catch]
][
throw/name make error! "I'm an error! exception" 'moniker
]
catch/name [sophisticated] 'moniker
Rubybegin # 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 S-Lang
New exceptions may be created using the
new_exception ("MyIOError", IOError, "My I/O Error");
will create an exception called MyIOError as a subclass of IOError. Exceptions may be generated using the throw statement, which can throw arbitrary S-Lang objects. Visual Basic .NETTry ' Do Something Catch ex As Exception When condition ' Handle Exception when a specific condition is true Catch ex As Exception ' Handle Exception Finally ' Cleanup, close connections etc ' NB this code is always executed regardless of if an Exception was raised or not! End Try Windows PowerShell
trap [Exception]
{
// Statements that execute in the event of an exception
}
// Statements in which exceptions might be thrown
See also
|
This article is from Wikipedia. All text is available under the terms of the GNU Free Documentation License.
Mercedes Car
This site monitored by SitePinger.net