[mercury-users] exceptions considered bloody annoying

Richard A. O'Keefe ok at cs.otago.ac.nz
Tue Apr 16 14:05:00 AEST 2002

Ralph Becket <rafe at cs.mu.OZ.AU> wrote:
	* For example, in Okasaki's "Purely Functional Data Structures", he
	  suggests using using an exception to signal when an already-present
	  member of a set data structure is being inserted.  If the exception is
	  caught, the insert operation reduces to the identity function and no
	  extra memory is allocated.  Otherwise the insert operation proceeds as
	  per usual.
This has always seemed to me like a silly approach.
It's far better to define one's interfaces so that they make sense
as often as possible.  The operation
    union_element_set :: a -> Set a -> Set a
should have the semantics
    abs(union_element_set x s) = abs(s) U {abs(x)}
where abs is the abstraction function.  I'm in the process of crunching
some real data now, and life (already difficult), would be a LOT harder
if I had to insert my own checks to program around unmathematical restrictions
that only make interfaces pointlessly complicated, and error-prone to use.

	> Quick quiz: does anyone regularly catch exceptions other than at the very
	> top level of their program? How often do people find themselves using
	> "throw" compared to just "error"?
	The classic example is web-server plug-ins.  You don't want your server
	to fall over just because some third-party plug-in throws an exception.
	You have to catch it, return the world to a sane state, and carry on.
An even older example:  Auckland University had a teaching language called
Small.  So that the load-and-go compiler could be written in iteself,
exceptions were added to the language.  You wrote
    FAULT PROCEDURE <name>(<arguments>) <body>;
They were like integer procedures.  Normal termination of the <body> meant
result 0 (unless you chose to return something else, abnormal
termination mean result non-0.  By today's standards, not a very powerful
mechanism, but adequate to ensure that dynamically loaded code could
"crash" without killing the entire system.  The only variables a dynamically
loaded component could modify were the ones you passed as parameters.

I note that Eiffel's exception handling mechanism is about as unlike 'throw'
as you can get.
mercury-users mailing list
post:  mercury-users at cs.mu.oz.au
administrative address: owner-mercury-users at cs.mu.oz.au
unsubscribe: Address: mercury-users-request at cs.mu.oz.au Message: unsubscribe
subscribe:   Address: mercury-users-request at cs.mu.oz.au Message: subscribe

More information about the users mailing list