Evitar mensajes de excepción de primera oportunidad cuando la excepción se maneja de forma segura

StackOverflow https://stackoverflow.com/questions/58380

  •  09-06-2019
  •  | 
  •  

Pregunta

El siguiente fragmento de código detecta la excepción EOS

using (var reader = new BinaryReader(httpRequestBodyStream)) {

    try {
        while (true) {
            bodyByteList.Add(reader.ReadByte());
        }
    } catch (EndOfStreamException) { }
}

Entonces, ¿por qué sigo recibiendo excepciones de primera oportunidad en mi consola?

Se produjo una excepción de primera oportunidad del tipo 'System.IO.EndOfStreamException' en mscorlib.dll

¿Hay alguna manera de ocultar estos mensajes de excepción de primera oportunidad?

¿Fue útil?

Solución

El objetivo de las excepciones de "primera oportunidad" es que las ve antes del controlador para que pueda detenerse en ellas durante la depuración en el momento del lanzamiento.Una excepción de "segunda oportunidad" es aquella que no tiene un controlador adecuado.A veces desea detectar excepciones de "primera oportunidad" porque es importante ver qué sucede cuando se lanza, incluso si alguien lo detecta.

No hay nada de qué preocuparse.Este es un comportamiento normal.

Otros consejos

Para evitar ver los mensajes, haga clic derecho en la ventana de salida y desmarque "Mensajes de excepción".

Sin embargo, verlos suceder puede ser bueno, si está interesado en saber cuándo se generan excepciones sin establecer puntos de interrupción y reconfigurar el depurador.

1) En Visual Studio puede cambiar la configuración de la forma en que el depurador maneja (interrumpe) las excepciones.

Vaya a Depurar > Excepciones.(Tenga en cuenta que es posible que esto no esté en su menú dependiendo de la configuración de su entorno de Visual Studio.Si no, simplemente agréguelo a su menú usando el menú Personalizar).

Allí se le presenta un cuadro de diálogo de excepciones y cuándo interrumpirlas.

En la línea "Excepciones de Common Language Runtime", puede anular la selección de lanzadas (lo que debería dejar de molestarle con las excepciones de primera oportunidad) y también puede anular la selección de No controladas por el usuario (que no recomendaría) si así lo desea.

2) El mensaje que recibe no debería estar en la consola, sino que debería aparecer en la ventana "Salida" de Visual Studio.Si este último es el caso, entonces no he encontrado la posibilidad de eliminarlo, pero no aparece si ejecuta la aplicación sin Visual Studio.

Espero que ayude.

A diferencia de Java, las excepciones .NET son bastante costosas en términos de potencia de procesamiento y las excepciones manejadas deben evitarse en la ruta de ejecución normal y exitosa.

No solo evitará el desorden en la ventana de la consola, sino que su rendimiento mejorará y hará que los contadores de rendimiento como las excepciones de .NET CLR sean más significativos.

En este ejemplo usarías

while (reader.PeekChar() != -1)
{
    bodyByteList.Add(reader.ReadByte());
}

Tuve este problema y no pude entender dónde se lanzó la excepción.Entonces mi solución fue permitir que Visual Studio dejara de ejecutarse en este tipo de excepción.

  1. Vaya a "Depuración/Excepciones"
  2. Expanda el árbol "Excepciones de Common Language Runtime".
  3. Expanda la rama "Sistema".
  4. Desplácese hacia abajo hasta donde está "NullReferenceException", y verifique la casilla de verificación "Lanzar" y desmarque el "Mano del usuario".
  5. Depura tu proyecto.

Si desea tener más control sobre estos mensajes, puede agregar un controlador:

Friend Sub AddTheHandler()
AddHandler AppDomain.CurrentDomain.FirstChanceException, AddressOf FirstChanceExceptionHandler
End Sub

<Conditional("DEBUG")>
Friend Sub FirstChanceExceptionHandler( source As Object,  e As Runtime.ExceptionServices.FirstChanceExceptionEventArgs)
' Process first chance exception

End Sub

Esto le permite silenciarlos como se menciona en otros comentarios, pero aún así garantiza que pueda estar al tanto de ellos.Creo que es bueno ver cuántos estoy lanzando realmente si registro un mensaje y una marca de tiempo en un archivo de texto.

En realidad, si hay muchas excepciones por segundo, logrará un mejor rendimiento verificando el valor de lector.EndOfStream.Imprimir esos mensajes de excepción es increíblemente lento y ocultarlos en Visual Studio no acelerará nada.

en VB.NET:

<DebuggerHidden()> _
Public Function Write(ByVal Text As String) As Boolean
   ...

Creo que la transmisión está generando esta excepción, por lo que su intento tiene un alcance limitado para detectarla.

Agregue algunos combos de prueba de captura más en los diferentes ámbitos hasta que lo detecte donde realmente se lanza, pero parece estar sucediendo en nuestro exterior de su uso, ya que el objeto de flujo no se crea en el alcance del uso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top