2008-09-12 10 views
75

El siguiente fragmento de código captura la excepción EOSprimeros mensajes de excepción oportunidad cuando la excepción se maneja con seguridad

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

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

Entonces, ¿por qué todavía recibo excepciones de primera oportunidad en mi consola?

Una primera excepción del tipo 'System.IO.EndOfStreamException' en mscorlib.dll

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

Respuesta

77

El punto de excepciones "primera oportunidad" es que se está viendo los pre-manejador de manera que se puede detener en ellos durante la depuración en el punto de lanzamiento. Una excepción de "segunda oportunidad" es aquella que no tiene un controlador apropiado. Algunas veces quiere atrapar excepciones de "primera oportunidad" porque es importante ver qué está sucediendo cuando se lanza, incluso si alguien lo está atrapando.

No hay nada que preocuparse por. Este es un comportamiento normal.

+56

De hecho, no es nada preocupante, pero complican el registro de salida de depuración :( –

-4

Creo que la transmisión arroja esta excepción, por lo que su intento tiene un alcance estrecho para atraparlo.

Agregue algunos más capturas de capturas alrededor de los diferentes ámbitos hasta que llegue donde realmente se lanza, pero parece estar sucediendo en nuestro exterior, ya que el objeto de transmisión no se crea en el alcance del uso .

19

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

Ir a Test> Excepciones. (Tenga en cuenta que esto puede no estar en su menú dependiendo de la configuración de su Entorno Visual Studio. Si no solo agréguelo a su menú usando el menú Personalizar)

Allí se le presenta un diálogo de excepciones y cuándo romper con ellas .

En la línea "Excepciones de Common Language Runtime" puede anular la selección lanzada (lo que debería dejar de molestarlo con las excepciones de primera oportunidad) y también puede deseleccionar User-unhandeled (que no recomendaría) si lo desea.

2) El mensaje que está recibiendo no debería estar en la consola, pero debería aparecer en la ventana 'Salida' de Visual Studio. Si este es el caso, no he encontrado la posibilidad de eliminarlo, pero no aparece si ejecuta la aplicación sin Visual Studio.

Espero que ayude.

10

diferencia de Java, .NET excepciones son bastante caros en términos de poder de procesamiento, y maneja excepciones se deben evitar en la ruta de ejecución normal y exitosa.

No sólo va a evitar el desorden en la ventana de la consola, pero su rendimiento mejorará, y que hará que los contadores de rendimiento como .NET CLR excepciones más significativas.

En este ejemplo se usaría

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

o puede obtener todos los bytes de una vez con ReadBytes y también hacer uso del almacenamiento en búfer, pero supongo que no fue así t la pregunta –

+4

No responde la pregunta –

+9

Claro que sí. "¿Hay alguna manera de ocultar estos mensajes de excepción de primera oportunidad?" - las primeras excepciones de probabilidad no aparecerían con este bucle :) – loudej

189

Para evitar ver los mensajes, haga clic en la ventana de salida y quita la marca de "mensajes de excepción".

Sin embargo, verlos suceder podría ser bueno, si le interesa saber cuándo se lanzan las excepciones sin establecer puntos de interrupción y volver a configurar el depurador.

+7

El nombre exacto es " Mensajes de excepción ". Gracias por responder la segunda mitad de la pregunta. – StriplingWarrior

-1

en VB.NET:

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

Esto no tiene nada que ver con la pregunta. –

+0

En realidad, el uso de [DebuggerNonUserCode] * oculta * los mensajes de "excepción de primera oportunidad". No me sorprendería que DebuggerHidden también lo haga. – Ruben

+0

No estoy seguro de si se consideran excepciones, pero [DebuggerNonUserCode] no ocultará ninguno de los "Asistentes de depuración administrados". Por ejemplo, obtengo BindingFailures cuando uso XmlSerializer, y todavía tengo que encontrar una manera de ocultarlo, aparte de desmarcar BindingFailure cuando se lanza desde el cuadro de diálogo Excepciones. –

2

En realidad, si están teniendo muchas excepciones por segundo, se lograría un mejor rendimiento obligada por el control de reader.EndOfStream valor .. La impresión de los mensajes de excepción es increíblemente lento, y esconderlos en el estudio visual no acelerará nada.

7

Tuve este problema y no pude averiguar dónde se produjo la excepción. Así que mi solución fue permitir que Visual Studio dejara de ejecutar este tipo de excepción.

  1. Vaya a "depuración/Excepciones"
  2. Expandir el árbol "Excepciones Common Language Runtime".
  3. Expande la rama "Sistema".
  4. Desplácese hasta donde está "NullReferenceException" y marque la casilla de verificación "throw" y desmarque la casilla "user-handled".
  5. Depure su proyecto.
4

Si desea más control sobre estos mensajes, se 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 al silencio como se ha mencionado en otros comentarios, pero aún así se asegura de que son capaces de tener en cuenta de ellos. Encuentro que es bueno ver cuántos estoy lanzando realmente si registro un mensaje y una marca de tiempo en un archivo de texto.

+1

Buena sugerencia. Pero vale la pena señalar que System.Runtime.ExceptionServices solo está disponible en .Net 4.0 o superior. Para aquellos de nosotros que tratamos con el código heredado escrito contra .Net 3.5 (o anterior). – paulsm4

+0

¿Es válido para *** ASP.NET ***? – Kiquenet

Cuestiones relacionadas