Unix Programming - Problems in the Design of Unix - The Unix API Doesn't Use Exceptions
C lacks a facility for throwing named exceptions with attached
data.[159] Thus, the C functions in the Unix API
indicate errors by returning a distinguished value (usually −1 or a
NULL character pointer) and setting a global errno variable.
In retrospect, this is the source of many subtle errors.
Programmers in a hurry often neglect to check return values. Because
no exception is thrown, the Rule of Repair is violated; program flow
continues until the error condition manifests as some kind of failure
or data corruption later in execution.
The absence of exceptions also means that some tasks which ought
to be simple idioms — like aborting from a signal handler on a
version with Berkeley-style signals — have to be performed with
code that is complex, subject to portability glitches, and bug-prone.
This problem can be (and normally is) hidden by bindings of the
Unix API in languages such as Python or Java that have exceptions.
The lack of exceptions is actually an indicator of a problem
with larger immediate implications; C's weak type ontology
makes communication between higher-level languages implemented in
it problematic. Most of the more modern languages, for example, have
lists and dictionaries as primary data types — but, because
these don't have any canonical representation in the universe of C,
attempting to pass lists between (say) Perl and Python is an unnatural
act requiring a lot of glue.
There are technologies that address the larger problem, such as CORBA,
but they tend to involve a lot of runtime translation and be
unpleasantly heavyweight.
[an error occurred while processing this directive]
|