 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 12 Nov, 2010 3:10 pm Asunto: Controlar Excepciones con volcado a fichero |
|
|
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 |
|
 |
rockman2003 Master

Registrado: 27 Ene 2004Mensajes: 202Ubicación: Madrid
|
Publicado: Vie 12 Nov, 2010 5:27 pm Asunto: |
|
|
Voy a probarlo ahora mismo.
Llevo pensando hacer algo así mucho tiempo |
|
| Volver arriba |
|
 |
Cesar C. Salazar Gonzalez Master


Registrado: 01 Oct 2002Mensajes: 2155Ubicación: San Cristóbal de Las Casas, Chiapas
|
Publicado: Sab 13 Nov, 2010 3:27 am Asunto: |
|
|
Excelente rutina, me gusta!! _________________
 |
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
Publicado: Jue 12 Jul, 2012 11:57 am Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 12 Jul, 2012 2:37 pm Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Mie 30 Sep, 2015 11:42 am Asunto: |
|
|
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 |
|
 |
Angel Master


Registrado: 15 Abr 2003Mensajes: 2311Ubicación: Toledo (España)
|
|
| Volver arriba |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|