Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Informes De Errores

Iniciado por vincent, 17 de Marzo de 2006, 11:43:22 AM

« anterior - próximo »

vincent

 Muy buenas,

estoy haciendo una aplicación que no requiere del control de un usuario (desatendida). El problema que tengo, és que aunque intento controlar todos los errores que me puedan aparecer, de tanto en quanto me aparece la típica ventana de error incontrolado a la que le tienes que dar al cerrar. Como no hay ningún usuario, no se aprieta a ningún botón y el tema se queda colgado. Hay alguna manera de decirle a windows que no saque este tipo de errores? He trasteado con la opción de informes de errores del panel de control -> sistema y no ha habido manera de sacar nada bueno...  :(

Gracias!
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

[EX3]

 Te muestro el codigo que uso yo en VB que facilmente imagino podras portar a C++. Es todo a traves del API de Windows oviamente:
'Esto en C++ supongo que iria en una cabecera *.h:
Public Const EXCEPTION_CONTINUE_EXECUTION = -1 'Continua la ejecucion ignorando el error.
Public Const EXCEPTION_NONCONTINUABLE As Long = &H1 'Detiene la ejecucion al instante, sin mostrar el mensaje de windows.

Public Declare Function SetUnhandledExceptionFilter Lib "kernel32" (ByVal lpTopLevelExceptionFilter As Long) As Long

Public Function MyExceptionHandler(lpEP As EXCEPTION_POINTERS) As Long
   'Terminamos la ejecucion del programa:
   MyExceptionHandler = EXCEPTION_NONCONTINUABLE
   
End Function

En el inicio del programa deberias hacer una llamada tal que asi:
'Activa la intercepcion de errores de Windows:
Call SetUnhandledExceptionFilter(AddressOf MyExceptionHandler)

Para desactivar la intercepcion de errores seria hacer otra llamada a SetUnhandledExceptionFilter() pasandole de parametro 0.

Esto haria que si se produce un error el programa ejecutaria al instante la funcion MyExceptionHandler() donde tendriamos el codigo que responderia al error antes de que Windows reaccione, mostrando nosotros por ejemplo un mensaje de error propio o guardando datos importantes antes de perderlos, lo bueno esta en que la constante EXCEPTION_NONCONTINUABLE hace que el programa, una vez ejecutada la funcion MyExceptionHandler() se cierre sin mostrar Windows ningun aviso ni reporte de errores ni nada, osea, se cerrara de forma silenciosa, que imagino es lo que andas buscando.

Un consejo, la constante EXCEPTION_CONTINUE_EXECUTION hace que el programa ignore totalmente el error y trate de seguir su ejecucion. No recomiendo mucho el uso de esta constante, ya que si el error del programa se produce de forma continuada al producirse en un punto clave, el programa entraria en un bucle cerrado tratando de ejecutarse sin lograrlo. Lo aviso por que esto me ha pasado alguna vez haciendo pruebas.

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

Lord Trancos 2

 Interesante código...  (ole)  
on los años y mucho esfuerzo he llegado a atesorar una ignorancia total sobre casi todas las cosas.
Gate to Avalon (mi Blog)

vincent

 Me estudiaré tu código con calma pq me parece tb bastante interesante. Gracias!!

Yo lo he conseguido con la función SetErrorMode(2).

Gracias!! (ole)  
Desarrollo en .Net y metodologías http://devnettips.blogspot.com

[EX3]

 Añado unas estructura de datos que requeria uno de los parametros de la funcion (se me escaparon con las prisas el otro dia xD)

'Esto en C++ supongo que iria en una cabecera *.h:
Public Const EXCEPTION_CONTINUE_EXECUTION = -1 'Continua la ejecucion ignorando el error.
Public Const EXCEPTION_NONCONTINUABLE As Long = &H1 'Detiene la ejecucion al instante, sin mostrar el mensaje de windows.
Public Const EXCEPTION_MAXIMUM_PARAMETERS = 15

Public Type CONTEXT
   FltF0 As Double
   FltF1 As Double
   FltF2 As Double
   FltF3 As Double
   FltF4 As Double
   FltF5 As Double
   FltF6 As Double
   FltF7 As Double
   FltF8 As Double
   FltF9 As Double
   FltF10 As Double
   FltF11 As Double
   FltF12 As Double
   FltF13 As Double
   FltF14 As Double
   FltF15 As Double
   FltF16 As Double
   FltF17 As Double
   FltF18 As Double
   FltF19 As Double
   FltF20 As Double
   FltF21 As Double
   FltF22 As Double
   FltF23 As Double
   FltF24 As Double
   FltF25 As Double
   FltF26 As Double
   FltF27 As Double
   FltF28 As Double
   FltF29 As Double
   FltF30 As Double
   FltF31 As Double
   IntV0 As Double
   IntT0 As Double
   IntT1 As Double
   IntT2 As Double
   IntT3 As Double
   IntT4 As Double
   IntT5 As Double
   IntT6 As Double
   IntT7 As Double
   IntS0 As Double
   IntS1 As Double
   IntS2 As Double
   IntS3 As Double
   IntS4 As Double
   IntS5 As Double
   IntFp As Double
   IntA0 As Double
   IntA1 As Double
   IntA2 As Double
   IntA3 As Double
   IntA4 As Double
   IntA5 As Double
   IntT8 As Double
   IntT9 As Double
   IntT10 As Double
   IntT11 As Double
   IntRa As Double
   IntT12 As Double
   IntAt As Double
   IntGp As Double
   IntSp As Double
   IntZero As Double
   Fpcr As Double
   SoftFpcr As Double
   Fir As Double
   Psr As Long
   ContextFlags As Long
   Fill(4) As Long
   
End Type

Public Type EXCEPTION_RECORD
   ExceptionCode As Long
   ExceptionFlags As Long
   pExceptionRecord As Long  ' Pointer to an EXCEPTION_RECORD structure
   ExceptionAddress As Long
   NumberParameters As Long
   ExceptionInformation(EXCEPTION_MAXIMUM_PARAMETERS - 1) As Long

End Type

Public Type EXCEPTION_POINTERS
   pExceptionRecord As EXCEPTION_RECORD
   ContextRecord As CONTEXT

End Type

Public Declare Function SetUnhandledExceptionFilter Lib "kernel32" (ByVal lpTopLevelExceptionFilter As Long) As Long

Public Function MyExceptionHandler(lpEP As EXCEPTION_POINTERS) As Long
   'Terminamos la ejecucion del programa:
   MyExceptionHandler = EXCEPTION_NONCONTINUABLE
   
End Function

Salu2...
José Miguel Sánchez Fernández
.NET Developer | Game Programmer | Unity Developer

Blog | Game Portfolio | LinkedIn | Twitter | Itch.io | Gamejolt

herman

 La verdad que lo que quieres lo consigues con SetErrorMode(SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX)

Pero una forma limpia de tratar con errores a nivel de sistema es con SetUnhandledExceptionFilter, asi puedes guardar el estado del programa antes de salir por un error.

 may have Alzheimer's but at least I don't have Alzheimer's






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.