Pregunta

En VB.NET a menudo Atrapo & # 8230; cuando :

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

¿Hay un C # equivalente a Catch & # 8230; When ?

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

¿Fue útil?

Solución

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 verificar esto, o esperar el lanzamiento oficial.

Otros consejos

No hay equivalente a Catch & # 8230; When en C #. Realmente tendrá que recurrir a una declaración de if dentro de su catch , y luego volver a realizarla si su condición no se cumple:

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

Eso no recreará la misma semántica que la expresión VB Catch When. Hay una diferencia clave. El VB Cuando la expresión se ejecuta antes de que se produzca el desenrollado de la pila Si examinara la pila en el punto 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 que la pila se desenrolla. Esto es especialmente importante cuando se trata de informes de errores. En el escenario de VB, tiene la capacidad de bloquearse con un seguimiento de pila que incluye el error. No es posible obtener ese comportamiento en C #.

EDITAR:

Escribió un publicación detallada en el blog sobre el tema.

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