2008-10-08 8 views
13

En VB.NET A menudo Catch…When:C# equivalente a la captura de VB.NET ... Cuando

Try 
    … 
Catch e As ArgumentNullException When e.ParamName.ToUpper() = "SAMPLES" 
    … 
End Try 

¿Existe un equivalente C# a Catch…When?

No quiero recurrir al uso de una declaración if dentro de un catch si es posible.

+0

Revisa esta página http://stackoverflow.com/questions/4269189/c-exception-monitor-with-filtering;) – Edward83

Respuesta

12

Esta funcionalidad se anunció para C# 6. Ahora es posible escribir

try { … } 
catch (MyException e) when (myfilter(e)) 
{ 
    … 
} 

Puede descargar la vista previa de Visual Studio 2015 ahora, para comprobar esto, o esperar a que el lanzamiento oficial.

15

No hay equivalente a Catch…When en C#. Que realmente va a tener que recurrir a una declaración if dentro de su catch, a continuación, volver a lanzar si no se cumple su condición:

try 
{ 
    … 
} 
catch (ArgumentNullException e) 
{ 
    if ("SAMPLES" == e.ParamName.ToUpper()) 
    { 
     … // handle exception 
    } 
    else 
    { 
     throw; // condition not fulfilled, let someone else handle the exception 
    } 
} 
+2

Estoy con cruizer y Nicholas Mancuso, simplemente usando 'throw' conserva la pila [The Mistake Todos los programadores de C# lo hacen] (http://msmvps.com/blogs/nickwienholt/archive/2006/07/04/103778.aspx "El error que comete cada programador de C#") – bob31334

+0

@ bob31334 Solo la pila capturada en el objeto de excepción, sin embargo, el estado del programa ya ha sido modificado y la pila original destruida, y finalmente los bloques ya ejecutados (en otras palabras, el filtro when se ejecuta en el nivel catch statement y no en el handler, esto es similar a SEH en win32 API) –

12

que no va a volver a crear la misma semántica que la captura VB cuando la expresión. Hay una diferencia clave. La VB Cuando la expresión se ejecuta antes de que se desenrolle la pila. Si tuviera que examinar la pila en el momento de un Filtro, realmente vería el marco donde se lanzó la excepción.

Tener un if en el bloque catch es diferente porque el bloque catch se ejecuta después de desenrollar la pila. Esto es especialmente importante cuando se trata de informes de errores. En el escenario VB, tiene la capacidad de bloquearse con un seguimiento de la pila, incluido el error. No es posible obtener ese comportamiento en C#.

EDIT:

escribió un detailed blog post sobre el tema.

+0

¿Estás seguro? puedes usar 'throw'; en lugar de 'tirar e;' –

+0

100% No tiene nada que ver con tiro. Es cuando se ejecuta la expresión llamada por Cuando. En VB ocurrirá mientras que el punto de aumento de excepción todavía está en la pila. – JaredPar

+0

En C#, incluso si la pila está descargada, el objeto de excepción 'e' aún tiene el rastreo de pila disponible. pero probablemente no sea tan útil como tener toda la pila disponible en el momento de la depuración. pero, para el tiempo de ejecución, ¿sería suficiente la traza de la pila de información de inicio de sesión? – dotnetcoder

Cuestiones relacionadas