Los errores dependen de tus componentes de acceso, yo uso los mdo y capturo los errores así:
Código Delphi
[-]
if (e is EMDOError) then
begin
strDebug := 'SqlCode: ' +inttostr(EMDOError(E).SQLCode) + espacio + E.ClassName;
strMessage:=EMDOError(E.Message);
Por el SQLCode, puedes saber qué tipo de error es. Existe un listado de esos números en
www.firebird.com.mx
El mejor sitio para capturar el error, sería el
OnPostError de tu dataset. En algunos casos, en el propio mensaje de error, dice que se viola la restricción "PK_CLIENTES_1", ese nombre lo verás en el Ib Expert, en las restricciones de esa tabla (Constraints, secondary indices, etc).
Además de lo anterior, en un ApplicationsEvents.OnException puedes añadir mensajes que ocurren para casos generales.
Dicho de otra forma, escribes código en el OnPostError para los mensajes de clave primaria. Si se viola una restricción UNIQUE, el código lo escribes en el ApplicationsEvents informando con un mensaje más general:"El valor introducido ya existe en la base de datos".
Saludos