Puedes usar la opción de defcon1 perfectamente.... pero en lugar de usarlo en un try... except, coloca ese código del except en un ApplicationsEvents.OnException.
Así la misma rutina de gestión de excepciones la tienes centralizada en un único sitio y te vale para todos los errores de la aplicación.
Si no quieres que muestre todo el mensaje cárgate el mensaje original de la excepción y pones el tuyo.... a ver si me explico con código:
en el applications.OnException
Código Delphi
[-]
var
personal, original:string;
personal := EmptyStr;
if E is EIBInterbaseError then
begin
case EIBInterBaseError(E).IBErrorCode of
$14000019: personal := 'Deadlock producido, pepe';
$14000888: personal := 'El título no puede estar vacio';
end;
MiLog.Add(E.Message); E.Message := personal;
Application.ShowException(E);
end;
Application.ShowException no estoy muy seguro, creo que es la forma correcta, pero no recuerdo si pertenece a "Application" o es una rutina escondida...
También puedes usar en Interbase un prefijo para todas tus excepciones, por ejemplo al definir la excepción lo haces así:
Código SQL
[-]
exception "Mi_excepcionIBInicio El usuario no puede estar en blanco Mi_excepcionIBFin"
exception "Mi_excepcionIBInicio El código debe ser mayor que cero Mi_excepcionIBFin"
Ahora en el applications.OnException buscas la cadena prefijo "Mi_excepcionIBInicio" y sólo copias el texto hasta el sufijo "Mi_excepcionIBFin"
saludos