Tenemos un servicio de registro de excepciones no controladas en el dominio de la aplicación de nivel (a través de Log4net).

Nos registrado:

2014-01-28 16:49:19,636 ERROR [49] FeedWrapperService – no controlada
Sistema.NullReferenceException: referencia a Objeto no establecida como instancia de un objeto.

Esta excepción no tiene traza de la pila. ¿Cómo es eso posible sin hacer algunas cosas locas con el objeto de excepción?

Nuestro código de control:

AppDomain.CurrentDomain.UnhandledException += LogAnyExceptions;

private void LogAnyExceptions(object sender, UnhandledExceptionEventArgs e)
{
    log.Error("unhandled", (Exception)e.ExceptionObject);
    throw (Exception)e.ExceptionObject;
}

Se me ocurre que el re-tiro de aquí es inútil, porque el dominio de aplicación vendrá abajo junto con el proceso de todos modos, pero creo que no afecta a nuestra situación.

La aplicación de windows visor de sucesos muestra también, sólo que esta null ref excepción y sin dejar rastro.

He probado el controlador de excepciones de registro y se inicia correctamente el seguimiento de la pila y cualquier excepción interna. Si fue lanzado por nuestro código, nos gustaría ver una traza de la pila. Si fue lanzado por la 3ª parte c# biblioteca a continuación, de nuevo, nos gustaría ver una traza de pila de al menos un método (si se trata de una re-lanzada excepción o no). Aquí vemos una excepción administrada con ninguna traza de la pila. No sé cómo esto es posible.

Mirando el descompilados de la 3ª parte de la biblioteca de la que habla el código no administrado, y en el caso de que planteó esta excepción es probable que en no administrado de la tierra, pero ¿cómo podría tal situación causa un administrado null ref excepción sin un stacktrace?

La causa de este problema es intermitente. Hemos estado ejecutando este código en producción durante varios meses y visto hacerlo una vez. Es bastante extraño.

El consenso general es que el sistema responsable de este tipo de problema debe ser empujado hacia un proceso hijo para que podamos lidiar con el problema y reiniciar de forma segura y automática, pero sería bueno saber lo que está pasando.

Editar para incluir comentarios info de abajo:

Mi excepción no es un estándar de re-tiro, porque la traza de la pila es nulo o vacío. No tiene el nombre de la re-método de lanzamiento. Investigando más, la clase de Excepción puede ser construido a partir de información serializada, y parece que el serializado información podría contener cadenas nulas para el seguimiento de la pila, y que potencialmente podría ser creado sin causar otros errores. Supongo que podría venir de allí, pero no sé cómo es que se originó.

Este hilo puede ayudar
Dedo hurgando: tratar de verificar Environment.StackTrace y tal vez de la excepción interna?
que una lectura muy interesante, pero mi excepción, no tiene un método en su seguimiento de la pila, que me gustaría tener si era normal re-tiro. Investigando más, la clase de Excepción puede ser construido a partir de información serializada, y parece que el serializado información podría contener cadenas nulas para el seguimiento de la pila sin provocar errores. Supongo que podría venir de allí, pero no sé cómo se originó.

OriginalEl autor Skym | 2014-01-31

2 Comentarios

  1. 10

    Si usted está recibiendo una excepción, pero no el correspondiente seguimiento de la pila, a continuación, en algún punto, un controlador de excepción es, probablemente, la evaluación de la excepción y re-tirando mal. Por ejemplo, si estás haciendo un throw ex; que va a comer el seguimiento de la pila que llevaron a ese punto. Para conservar a la pila de llamadas que desea simplemente throw;
    Lanzar excepciones de las mejores prácticas

    Tenga en cuenta que el C# camino es el opuesto de la convención para el lenguaje Java, donde se supone que para throw ex; Java referencia: Mejor Práctica: la Captura y re-lanzar Excepciones Java

    OriginalEl autor shooley

  2. 5

    Prefiero a administrar mi excepciones con las excepciones personalizadas, Si en el caso de que usted está utilizando su propio excepciones que pueden ir a la clase se defina y anular el stacktrace. e.g:

    public class YourCustomException: Exception
    {
        public YourCustomException() : base() { } //constructor
    
        public override string StackTrace 
        {
            get { return "Message instead stacktrace"; }
        }
    }

    OriginalEl autor Daniel Vega

Dejar respuesta

Please enter your comment!
Please enter your name here