Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Controlar Excepciones con volcado a fichero

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Tips & Tricks
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Controlar Excepciones con volcado a fichero Responder citando

Como controlar las excepciones de nuestro programa y que quede constancia en un fichero para posteriormente poder corregir en nuestro codigo dichos problemas.

Los parametros que se utilizan en este codido son:
fV: Es el nombre del formulario principal
fV->SV: Es una estructura global creada en "fV"
1. Cada vez que Entro, Activo o Muestro un Formulario o Frame, guardo el nombre del OBJETO en la Estructura con:
Código:

fV->SV->Formulario = ((TForm *)Sender)->Name;//Formulario
fV->SV->Formulario = ((TFrame *)Sender)->Name;//O Frame
fV->MenDialogo();//Función propia para Mensajes, sustituye a ShowMessage()


2. Cada vez que Presiono un Botón de mi Aplicación guardo el nombre de dicho Botón con:
Código:

fV->SV->Boton = ((TButton *)Sender)->Name;//En el evento OnClick de cada botón.


En mi caso implemento la funcion en un "TMDatos"(Modulo de Datos), pero se puede poner en cualquier Formulario que sea el principal o que siempre este activo en la aplicación.
Código:

__fastcall TMDatos::TMDatos(TComponent* Owner):TDataModule(Owner)
{
   Application->OnException = Controla_Excepcion;
}
//---------------------------------------------------------------------------

void __fastcall TMDatos::Controla_Excepcion(TObject *Sender, Exception *E)
{
   TIniFile* LOG = new TIniFile(fV->SV->DatSetPCRutaTPV_Ncr + L"Excepciones.Log");

    String Seccion = Date().DateString() +  L" " + Time().TimeString();
    String V_Error = L"Excepcion producida";
    String D_BDD = L"Excepcion de Interbase", D_TPV = L"Excepcion del Programa";
    String V_SQL = L"N. Error SQLCode", V_Interbase = L"N. Error Interbase", V_Mensaje = L"Mensaje Mostrado";
    String V_Objeto = L"Boton Pulsado", V_Formulario = L"Formulario Activo";
    String V_E_U = "Error E->UnitName() en", V_S_U = L"Error Sender->UnitName() en";
    String V_E_C = "Error E->ClassName()", V_S_C = L"Error Sender->ClassName()";

   //Si realmente es de interbase, tratamos el codigo de error,
    //en caso contrario, tratamos el codigo de error del programa.
   if(E->ClassNameIs("EIBInterBaseError"))
   {
      EIBInterBaseError *ErrorIB = reinterpret_cast<EIBInterBaseError>(E);

        //Escribo en Fichero Excepciones.Log los Errores producidos
        LOG->WriteString(Seccion, V_Error, D_BDD);
        LOG->WriteInteger(Seccion, V_SQL, ErrorIB->SQLCode);
        LOG->WriteInteger(Seccion, V_Interbase, ErrorIB->IBErrorCode);
        LOG->WriteString(Seccion, V_Mensaje, ErrorIB->Message);
        LOG->WriteString(Seccion, V_Formulario, fV->SV->Formulario);
      LOG->WriteString(Seccion, V_Objeto, fV->SV->Boton);
        LOG->WriteString(Seccion, V_E_U, E->UnitName());
        LOG->WriteString(Seccion, V_S_U, Sender->UnitName());
        LOG->WriteString(Seccion, V_E_C, E->ClassName());
        LOG->WriteString(Seccion, V_S_C, Sender->ClassName());

       String Mensaje =
           "Error interno de Interbase.\n"
         "Número de Error SQLCode: " + String(ErrorIB->SQLCode) + "\n"
            "Número de Error IBErrorCode: " + String(ErrorIB->IBErrorCode) + "\n\n"
         "Por favor, anote este mensaje con sus números de Error y pongase en contacto con el Servicio Técnico\n";

      //Este error me interesa particularmente por desconexiones de RED
      if(ErrorIB->SQLCode == -902)
      {
         fV->MenDialogo(
         "Su RED ha sufrido un Corte de Luz, "
         "o su conexión de RED no es consistente a Fallos.\n\n"
            + Mensaje +
         "\nTPVBarman Élite, tiene que desconectarse del Servidor.\n"
         "Saldrá del Programa, para evitar un mal mayor.\n","E");

            IBDatabase->Close();
            MostrarBarraInicio();
         Application->Terminate();// Salir del programa con Error
         exit(0);
      }
        else
           fV->MenDialogo(Mensaje,"E");
   }
   else
       {
            //Escribo en Fichero Excepciones.Log los Errores producidos
            LOG->WriteString(Seccion, V_Error, D_TPV);
            LOG->WriteString(Seccion, V_Mensaje, E->Message);
            LOG->WriteString(Seccion, V_Formulario, fV->SV->Formulario);
         LOG->WriteString(Seccion, V_Objeto, fV->SV->Boton);
           LOG->WriteString(Seccion, V_E_U, E->UnitName());
           LOG->WriteString(Seccion, V_S_U, Sender->UnitName());
           LOG->WriteString(Seccion, V_E_C, E->ClassName());
           LOG->WriteString(Seccion, V_S_C, Sender->ClassName());

          fV->MenDialogo(L"Error Interno Controlado:\nObjeto: " + Sender->ClassName() + "\nMensaje:\n" + E->Message, "E");
        }

    delete LOG;
}
//---------------------------------------------------------------------------


El .h
Código:

private:   // User declarations
   void __fastcall Controla_Excepcion(TObject *Sender, Exception *E);
public:      // User declarations
        __fastcall TMDatos(TComponent* Owner);


Y por fin el resultado del fichero "Excepciones.Log".
Código:

[12/11/2010 14:41:42]
Excepcion producida=Excepcion del Programa
Mensaje Mostrado=Access violation at address 008C9F7D in module 'TPVBarman.exe'. Write of address 00000048
Formulario Activo=frmOpciones
Boton Pulsado=BtnImpresoraTK
Error E->UnitName() en=SysUtils
Error Sender->UnitName() en=ExtCtrls
Error E->ClassName()=EAccessViolation
Error Sender->ClassName()=TPanel


Espero les sirva de ayuda.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Voy a probarlo ahora mismo.
Llevo pensando hacer algo así mucho tiempo
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Excelente rutina, me gusta!!
_________________
Cool
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email MSN Messenger
Mensaje    Asunto: Responder citando

Estoy tratando de adaptar esta rutina de Jesús a mis necesidades pero al compilar me da un error en LOG->WriteString(Seccion, V_E_U, E->UnitName()). Me dice que UnitName() no es un miembro de Exception ni de TObject. ¿Falta algo en el código de Jesús?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

El código funciona perfectamente en Builder 2010. Si UnitName no es miembro de TObjet (*E) verifica si en tu versión de Builder cambia el nombre de dicho identificador.
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Gracias Jesús. Tendré que investigar porque yo uso Builder 5.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Estaba repasando una vez más esta rutina y me da la impresión que falta la definición, o yo no la veo, de esa estrutura SV que cita Jesús.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

struct TEstr_Valores
{aquí pones los valores que necesites }*SV;


La estructura es indiferente, yo utilizo una Estructura con cientos de variables en el formulario principal para tener acceso a ellos desde cualquier otro formulario.

Utilizo Unicode wchar_t en todos mis proyectos, de ahí tu posible error:
Cita:

LOG->WriteString(Seccion, V_E_U, E->UnitName()).

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Gracias Jesús. Seguiré dándote la brasa porque hay muchas cosas que se me escapan de la rutina, que por otra parte es fabulosa.
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.