Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   No Saltan las excepciones (https://www.clubdelphi.com/foros/showthread.php?t=51808)

sitrico 30-12-2007 02:53:42

No Saltan las excepciones
 
Tengo el siguiente código:

Código Delphi [-]
procedure TfActualizarRubros.btOkClick(Sender: TObject);
Var
Cur : TCursor;
Begin
Cur := Screen.Cursor;
Screen.Cursor := crHourglass;
  inherited;
Try
   u.Transaction.StartTransaction;
   dbMontos.DisableControls;
   Case modo of
      1 : IncluirRubro;
      2 : ModificarRubro;
      3 : BorrarRubro;
      End;
   u.Transaction.Commit;
   dbMontos.EnableControls;
Except
   On e:Exception do
      Begin
      u.Transaction.Rollback;
      ModalResult := mrNone;
      Exception.Create('Error al '+Caption+#13+
                              'Mensaje del servidor: '#13+e.Message);
      End
   End;
Screen.Cursor := Cur;
end;

Es la estructura básica que he usado desde hace tiempo para actualizar las tablas firebird. Inicio una transacción, ejecuto las sentencias SQL correspondientes y termino con un commit. Si salta una excepción ejecuto el RollBack y muestro el mensaje correspondiente.

Al probar (forzando un error) no se muestra el mensaje (exception.create...), a pesar de que por debug puedo ver que si se ejecutan las instrucciones dentro del except y se muestra la excepción del IDE de Delphi. Si lo muestro como un MessageBox si aparece el mensaje.

Esto con Delphi 7.

Caral 30-12-2007 03:08:00

Hola
Yo lo hago asi:
Código Delphi [-]
 except
        on E:Exception do
        begin
           u.Transaction.RollbackTrans;
           MessageDlg('No fue posible completar la transacción',mtError,[mbOK],0);
        end;
Saludos

AzidRain 30-12-2007 04:11:26

te falta volver a lanzar la excepcion con raise. Una vez manejada la excepción se debe relanzar en este caso porque vuelves a usar exception.create....yo creo que si solamente quieres mostrar el mensaje basta poner el messagedlg y hacer el raise...no tiene caso crear una nueva excepción.

Lepe 30-12-2007 14:08:07

En realidad está enmascarando la excepción, para mostrar un mensaje más "amigable", no es del todo correcto, pero dado que no oculta la excepción, me parece aceptable.

Añade esto a tu linea:
Código Delphi [-]
raise Exception.Create('Error al '+Caption+#13+
                              'Mensaje del servidor: '#13+e.Message);

Si quieres lanzar la misma excepción producida dentro del bloque except, usa solo :
Código Delphi [-]
 Except
   On e:Exception do
      Begin
      u.Transaction.Rollback;
      ModalResult := mrNone;
      raise;   // lanzar la excepción original como advertencia
// una vez manejado el caso
      End
   End;

Lo que nunca debes hacer es algo así:
Código Delphi [-]
try

except
end;
Porque el programa dará un error y lo oculta, jamás serás capaz de saber que se ha producido un error y tu programa se quedará totalmente inestable a partir de ese momento.

Saludos

sitrico 30-12-2007 23:40:14

Gracias a todos, en realidad ya habia cambiado a un MessajeBox, pero me tenia verde lo de no mostrar la excepción (faltaba el raise). :rolleyes:

Juan


La franja horaria es GMT +2. Ahora son las 09:22:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi