Well, I guess that means Delphi has a flaw. Since Lazarus need not be just a Delphi clone, why not improve that 
You said before that Delphi throws the exception before OnExit, but that seems quite logical... At what point does Lazarus do that? After OnExit?
What I meant is that in Delphi, when the control looses focus, validation is performed, the exception is raised if validation fails, and only after that the the OnExit handler is called.
In Lazarus I changed this sequence to focus lost -> call OnExit handler -> perform validation -> raise exception when validation fails.
So, where in Delphi you cannot prevent or intercept the exception in any of the MaskEdit event handlers, in Lazarus at least you can do so in the OnExit eventhandler.
Another thing is that the unhandled exception only causes a simple dialog to appear in Delphi prompting you to press escape, whilst in Lazarus the default dialog appears inviting you to kill the application or continue and risk dataloss, which for the end user is confusing to say the least.
To remain compatible with Delphi, it is however necessary to raise the exception when validation fails. This is how programmers expect it to be.
I'm not really sure why the Borland guys choose to use an exception, rather then simply doing a showmessage.
But we'll have to live with that.
Events are handled somewhere in a "black box" and I cannot influence what happens then...
But you can. You can extend / override the default application exception handler.
I must say I never did this, but AFAIK it should be possible.
Pseudocode:
Procedure NewExceptionhandler(...);
begin
if Exception is EDBEditError then
begin
do a simple showmessage
end
else call the OldExceptionHandler
end;
Bart