We have so far described three behaviors that are allowed of a legal SML program -- it may either evaluate to a value, loop forever, or raise an exception. While we have been brief on the last of these three, it is a useful language mechanism for dealing with cases where we do not necessarily desire to give back a value.
In this lecture, we learned that exceptions are values of a type
exn, which enjoys the property of extensibility, in that
constructors may be added to it dynamically, via using the
These include common exceptions such as
Match, but also
custom exceptions, which may be defined to take in information in the form of
other values, much like other constructors. This is useful, because exceptions
may also be handled via the
handle keyword, which allows us to
recover from potentially-fatal errors at a different location.
This is both useful for error recovery, and for nuanced control flow. We saw that using this, we were able to write functions in an exception-handling style, which resembled the form of continuation-passing style code.