Cosmin Truta and I have developed a try/catch/throw exception-handling interface for C. It basically works the way you would expect:
Try {
/* Maybe a Throw statement will be executed */
/* (maybe within a deeply nested function): */
/* Throw e; */
/* If so, execution jumps to the catch clause. */
}
Catch (e) {
/* An exception was thrown and copied into e. */
}
The interface of the latest release is fully implemented and documented in cexcept.h. It is thread-safe, and the programmer has the flexibility (and burden) of specifying the exception type.
You can get a tarball or zip file containing the latest (2001-Jul-12-Thu) release of cexcept.h and accompanying example code, etc, or browse through the various versions of the individual files:
There used to be a mailing list for discussion of cexcept, but the list server didn't survive a server migration, and apparently no one noticed. I'd be happy to resurrect the mailing list if anyone is interested, just ask me.
To browse the list archive, enter "cexcept" in the form below and submit it.
This project originally grew out of a discussion of error handling in libpng (the PNG reference library), but is now independent of libpng.
Doug Jones's exception handling interface, like cexcept, uses only a small .h file, but it makes some different design tradeoffs (it is modeled after the Ada programming language).
Doug Gwyn's Ex package uses both a small .h file and a small .c file that defines a global variable (not suitable for multi-threaded programs). The exception type is a integer.
Andrew Snowden's LIBXC likewise uses a small .h and a small .c file that defines a global variable. The exception type is a fixed structure with some typically useful members including filename and line number. Uncaught exceptions elicit helpful messages. The package also includes libc function wrappers that throw exceptions rather than return unsuccessfully.
Ian Zimmerman's exc package uses a larger .c file
and .h file and provides more features, like built-in
support for polymorphic exceptions and multiple catch clauses, and
detection of programmer errors like jumping out of a try clause [to
accomplish this, the keyword return is redefined, which
is very clever, although at most one package could use this trick
at a time]. The exc package is contained inside the larger gim
package (in libgim/exc.*). Look for filenames beginning
gim- in this
directory.
Bruce W. Bigby's General Exception-Handling Faciliity (GEF) uses three .c files and three .h files to provide not only exception handling but also design-by-contract support (invariants, preconditions, postconditions, assertions). It is modeled after the Eiffel programming language.
|