Voy a dar mi apreciacion:
Las excepciones
no deben ser
user friendly. Deben mostrar la mayor cantidad de detalle, por mas "tecnico" que sea, de cual fue la causa del error, el estado de los objetos que intervenian en ese momento.. mientras mas cosas mejor. Una buena excepcion no solo contiene eso, sino que tambien deberia indicar posibles soluciones o donde mirar.
En tu codigo estas cometiendo el
grave error de capturar
todas las excepciones y mostrar "no pudiste borrar porque es un registro protegido por el sistema". Quiere decir que si ocurre una excepcion EOutOfMemory se va a mostrar ese mensaje, si ocurre una EAccesViolation te va a decir "no podes eliminar un registro protegido por el sistema". Estas basicamente escondiendo errores de implementacion que vaya a saber que repercusion tienen, que estados inconsistentes estas dejando por ahi, o que operaciones estas bloqueando por una razon que no es
Escribe excepciones que sean amigables para el programador (tu mismo!!). Yo antes hacia cosas similares a esa, ponia un mensaje de error "generico" ej: "no se pudo grabar el cliente". Genial gracias, ahora porque no se pudo? Viole una primary o unique key? Deje un campo en null? Me quede sin memoria? No instancie un objeto o lo destrui antes sin querer? Error de sintaxis sql? La tabla no existe? Como puedo saberlo?????? Facil, te abres el Delphi, y que el depurador te lance la excepcion, para nada cool eh
Considera este codigo:
Código Delphi
[-]
try
Post, Commit, etc
except
on E: ERegistroProtegido then
end;
Es una pequeña mejora al anterior.
En realidad la pregunta que yo me hago es, porque existe la posibilidad de llegar a una situacion de "borrar un registro protegido por el sistema"? No es mejor que nunca se pueda llegar a tal cosa? Realmente, vas a iniciar una transaccion, hacer rollback o commit, solo para despues decir: "esto no lo puedes borrar"?
Si hay un conjunto de registros que no se pueden borrar y otros si, entonces ahi la cuestion es, antes de intentar hacer cualquier cosa, validar que sea un registro protegido, y de ser asi, elevar una excepcion
Código Delphi
[-]
procedure Borrar(const IdRegistro: Int64);
begin
if IsSystemProtectedRec(IdRegistro, ATableName) then
raise ESystemProtectedRec.CreateFmt('Cannot delete the record %d of the table %s because is system protected', [IdRegistro, ATableName]);
end;
Las excepciones son eso: excepciones. Algo realmente malo que no deberia pasar. Son casos raros (por evitar el abuso de la palabra, casos excepcionales). Y si algo de esto que no es normal que pase, lo mas logico seria obtener la mayor cantidad de informacion posible, puesto que en algunos casos un tonto EAccessViolation puede ser trivial (en otros no!), pero que tal si no se puede reproducir la excepcion siempre? Tu codigo es 100% deterministico?