2010-11-24 15 views
10

¿Admite C# los filtros de compilación? ¿Cómo funcionan incluso los filtros o qué hacen?C# exception filter?

Al igual que el reflector decompiles un filtro como

try 
{ 
} 
catch(Exception e) when (?) 
{ 
}
+0

puede añadir una mejor definición o ejemplo de su querido filtrar :) –

+0

http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-334.pdf, # 23.3: cómo se manejan las excepciones –

+2

Ver también: http://stackoverflow.com/questions/181188/c-equivalent-to-vb-net-catch-when –

Respuesta

5

C# no apoyaron los filtros de excepción como VB hace hasta C# 6. En cuanto a su funcionamiento, ver de Eric Lippert "Finally" Does Not Mean "Immediately"

A partir de C# 6, a excepción los filtros son compatibles, como the C# FAQ demonstrates:

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

Si el parenthesi La expresión zed después de 'si' [ahora when] se evalúa como verdadera, se ejecuta el bloque catch, de lo contrario, la excepción continúa.

Los filtros de excepción son preferibles a capturar y volver a lanzar porque dejan la pila ilesa. Si la excepción hace que la pila se descargue más tarde, puede ver de dónde vino originalmente, en lugar de solo el último lugar donde fue arrojada nuevamente.

También es una forma común y aceptada de "abuso" utilizar filtros de excepción para efectos secundarios; p.ej. explotación florestal. Pueden inspeccionar una excepción "volando por" sin interceptar su curso. En esos casos, el filtro será a menudo una llamada a una función de ayuda de retorno de falsa que ejecuta los efectos secundarios:

private static bool Log(Exception e) { /* log it */ ; return false; } 
… 
try { … } 
catch (Exception e) when (Log(e)) {} 

Gracias a Mafii para el enlace a la documentación de C# 6.

+0

Está bien, ¿entonces el filtro es básicamente solo una declaración if y si no se cumple, lo vuelve a lanzar? – Will

+3

No es sutilmente diferente ya que un filtro real ni siquiera lo detecta si decide manejar la excepción, mientras que una solución alternativa con un if lo captura y lo vuelve a lanzar. Esto tiene una semántica ligeramente diferente relacionada con el desenrollamiento de la pila. – CodesInChaos

+0

También es diferente cuando se ejecuta. Los filtros se ejecutan antes de atrapar bloques, incluso si esos filtros están definidos más profundamente en la pila de llamadas. –

23

Desde C# 6 ahora puede hacer esto.

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

Esto es diferente de usar una declaración if desde dentro del bloque de catch, utilizando filtros de excepción voluntad no desenrollar la pila. apoyo

4

Filtros de excepción en C# se introduce en C# 6 (Visual Studio "Dev14"):

try 
{ 
    throw new ApplicationException("1"); 
} 
catch (ApplicationException ex) when (ex.Message == "2") 
{ 
    // this one won't execute. 
} 
catch (ApplicationException ex) when (ex.Message == "1") 
{ 
    // this one will execute 
} 
+2

'if' ha sido reemplazado con' when' en la edición final de C# 6 – Mafii

0

Si bien la captura de excepciones, si usted quiere manejar las excepciones de manera diferente, puede utilizar filtro de excepción
- Después de C# 6,0
- Después de VB 7.1 utilizando cuando

1) C# muestra después de C# 6.0

try 
{ 
    throw new CustomException { Severity = 100 }; 
} 
catch (CustomException ex) when (ex.Severity > 50) 
{ 
    Console.WriteLine("*BING BING* WARNING *BING BING*"); 
} 
catch (CustomException ex) 
{ 
    Console.WriteLine("Whooops!"); 
} 

Nota: Tenga en cuenta que el orden importa

2) C# de ejemplo Antes de C# 6,0

try 
{ 
    throw new CustomException { Severity = 100 }; 
} 
catch (CustomException ex) 
{ 
    if (ex.Severity > 50) 
    { 
     Console.WriteLine("*BING BING* WARNING *BING BING*"); 
    } 
    else 
    { 
     Console.WriteLine("Whooops!"); 
    } 
} 

Desde este pedazo de código es equivalente a la anterior. significa que son equivalentes, ¿verdad?--- "Pero No, no son equivalentes"
NOTA: los filtros de excepción no se desenrollan la pila

Leer más desde Here