Ver Mensaje Individual
  #3  
Antiguo 13-12-2008
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
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);
//creo un tipo de excepción propia
...
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
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.

Última edición por Lepe fecha: 13-12-2008 a las 07:47:48.
Responder Con Cita