<P> Kiniry also notes that "Language design only partially influences the use of exceptions, and consequently, the manner in which one handles partial and total failures during system execution . The other major influence is examples of use, typically in core libraries and code examples in technical books, magazine articles, and online discussion forums, and in an organization's code standards ." </P> <P> Contemporary applications face many design challenges when considering exception handling strategies . Particularly in modern enterprise level applications, exceptions must often cross process boundaries and machine boundaries . Part of designing a solid exception handling strategy is recognizing when a process has failed to the point where it cannot be economically handled by the software portion of the process . </P> <P> Software exception handling developed in Lisp in the 1960s and 1970s . This originated in LISP 1.5 (1962), where exceptions were caught by the ERRSET keyword, which returned NIL in case of an error, instead of terminating the program or entering the debugger . Error raising was introduced in MacLisp in the late 1960s via the ERR keyword . This was rapidly used not only for error raising, but for non-local control flow, and thus was augmented by two new keywords, CATCH and THROW (MacLisp June 1972), reserving ERRSET and ERR for error handling . The cleanup behavior now generally called "finally" was introduced in NIL (New Implementation of LISP) in the mid - to late - 1970s as UNWIND - PROTECT . This was then adopted by Common Lisp . Contemporary with this was dynamic - wind in Scheme, which handled exceptions in closures . The first papers on structured exception handling were Goodenough (1975a) and Goodenough (1975b). Exception handling was subsequently widely adopted by many programming languages from the 1980s onward . </P> <P> Originally, software exception handling included both resumable exceptions (resumption semantics), like most hardware exceptions, and non-resumable exceptions (termination semantics). However, resumption semantics were considered ineffective in practice in the 1970s and 1980s (see C++ standardization discussion, quoted below) and are no longer in common use, though provided by programming languages like Common Lisp and Dylan . </P>

Annotations support the automatic conversion of exceptions from one type to another