Visual Studio tiene una característica determinada que facilita enormemente la depuración de excepciones no controladas: se detiene en la línea ofensiva del código y muestra la excepción.¿Puedo detener Visual Studio en excepciones no controladas dentro del código de la tarea?
Parece que la clase Task
está diseñada de tal manera que esta característica siempre se suprime: capta todas las excepciones y luego vuelve a lanzar una excepción diferente cuando la tarea está Wait
ed o finalizada.
Sé que puedo hacer que se detenga en las excepciones de primera oportunidad, pero esto no siempre ayuda: imagine que se producen varias excepciones manejadas del mismo tipo antes que la no controlada. En este caso, VS se detendrá en cada excepción no problemática además de la que realmente causa el problema.
Otra alternativa es aún menos aceptable: simplemente mirando el rastro de la pila del InnerException
: esto significa que aunque sé qué línea causó la excepción, no puedo acceder a su estado local, como podría si el programa fuera en realidad se detuvo allí.
¿De alguna manera puedo obtener lo mejor de ambos mundos, usando la clase Task
pero sin tener que vivir con el conjunto de funciones de depuración de excepciones degradadas?
Bono pregunta: ¿significa esto que una excepción de referencia nula dentro de un bloque de await
no hará que Visual Studio para detener allí mismo, pero en su lugar dejar en otro lugar por completo?
El método privado Task.Execute() contiene la instrucción catch everything. HandleException y AddException después de eso. Todo es privado y no virtual. –
@HansPassant si desea publicar eso como una respuesta (lo que implica que esto es imposible, básicamente), eventualmente lo aceptaré en ausencia de mejores respuestas. –