Yo lo tengo muy claro, aunque puede que mi método sea discutible
.
creo que todo se reduce a:
- querer abortar la ejecución del programa.
Si quieres abortar, usa una excepción.
Si no, usa un MessageBox.
En tu caso no es necesario una excepción porque el código del botón no hace mucho código.
Hay veces que el código es muy complejo, y anidar los "if" junto con los MessageBox para que todo funcione correctamente hace que el código se complique, en estos casos usar una excepción puede ser más simple y funcional.
Un ejemplo didáctico:
Código Delphi
[-]
type eRequerido = class(Exception);
...
procedure TForm1.GuardaValores;
msg := '';
for i:= 0 to tabla1.fields.count -1 do
if tabla1.fields[i].required and tabla1.fields[i].isnull then
msg := msg + 'campo ' + tabla.fields[i].displayName + ' es requerido' +#13#10;
if msg <> '' then
raise eRequerido.Create(' Se necesitan valores en los siguientes campos:' + msg);
tabla1.Post;
CalcularBaseImponible;
end;
Procedure TForm1.CalculaTotal:
begin
try
GuardaValores;
except on exception : eRequerido do
statusbar1.text := 'No se puede calcular el total de la factura, faltan datos';
raise;
end;
end;
Se podría incluir un MessageBox en lugar de una excepción, pero como digo, esto es un ejemplo simple, se puede complicar más las cosas.
Llamamos a CalculaTotal:
Lo que hago es bien sencillo, primero miro si algún campo requerido está en blanco, si es así, lanzo una excepción propia con un mensaje indicando exactamente los campos vacíos que el usuario debe rellenar y en este punto, se corta le ejecución del programa, es decir, las instrucciones que están más abajo no se ejecutarán.
Pero aún hay algo más: al producirse una excepción se vuelve hacia atrás en la pila de llamadas ejecutadas, así que volverá a la rutina "CalculaTotal" y allí encuentra un bloque try ... except. Puesto que la excepción lanzada por mí es una eRequerido y coincide con la que hay escrita en el bloque try... except, se ejecuta el código, colocando un mensaje en el StatusBar. y ahora se obliga a relanzar la excepción producida con la instrucción
raise; (ten en cuenta que hasta ahora no se ha mostrado el mensaje de error, de hecho los try...excepts están para intentar corregir el error y dar la posibilidad de que el programa continúe con normalidad), por tanto, se vuelve a hacia atrás en la pila de llamadas, pero ahora, desde la rutina CalculaTotal hacia atrás...
Si al volver hacia atrás en la pila de llamadas no encuentra ningún try..except llegará al nivel más alto que es el Application.OnExceptions (desde el componente TApplications de delphi puedes usarlo). Si no tienes un TApplications en tu programa, la excepción se muestra al usuario.
Si hubiesemos usado un MessageBox, en la rutina CalculaTotal no sabríamos si se ha guardado la factura o no, tendríamos que echar mano de una bandera (variable booleana que la la ponemos a true o false dependiendo si ha habido error o no al guardar) y con estas cosas se nos empieza a complicar el código, en legibilidad, claridad, etc.
Como bien dices, ya que el botón lo único que hace es chequear si todo está correcto o no, no tiene sentido lanzar una excepción. La excepción se lanza para que no ocurra un mal mayor.
Espero haya sido claro.... que va a ser que no
Saludos