I found a robust solution described in this MathGroup message by Maxim Rytin:
messageHandler = If[Last[#], Abort[]] &
Internal`AddHandler["Message", messageHandler]
This will abort the computation whenever a message would be printed.
It can be turned off using
Internal`RemoveHandler["Message", messageHandler]
Alternatively this can be temporarily applied to a piece of code like this:
Internal`HandlerBlock[
{"Message", messageHandler},
(* ... code here ... *)
]
The currently set message handlers can be retrieved using
Internal`Handlers["Message"]
(Internal`Handlers[]
will return all existing handlers)
Whenever a message is generated, Hold[message, printed]
is passed to all "Message" handler functions where message
is the message text and printed
is True is the message would be printed, False
otherwise.
The debugging palette appears to use the same mechanism to break on messages.
To make it work with parallel evaluations, one can simply register the same handler on all kernels using ParallelEvaluate
.