2010-03-04 20 views
14

No encuentro el operador "no es" en C#. Por ejemplo, tengo el siguiente código que no funciona. Necesito comprobar que err no es del tipo clase ThreadAbortException.NO operador en C#

catch (Exception err) 
    { 
     if (err is not ThreadAbortException) 
     { 
     } 
    } 
+0

Gracias, las respuestas ambos están trabajando;) – Tomas

+0

usted puede hacer esto: si no se object.ReferenceEquals (err.GetType(), GetType (ThreadAbortException)) Entonces –

Respuesta

35

basta con cambiar el bloque catch a:

catch(ThreadAbortException ex) 
{ 
} 
catch(Exception ex) 
{ 
} 

para que pueda manejar ThreadAbortExceptions y todos los demás por separado.

+1

Esta es una mejor solución a la situación actual. +1 –

+2

Menos mal, eso estuvo cerca. Odio ver '! (A es B)' en cualquier lugar! – ChaosPandion

+0

Ver el fragmento de código en la pregunta realmente me confundió, era si hubiera olvidado cómo detectar excepciones. Esta es la forma correcta de hecho. – Finglas

33

En este caso, envolver y comprobar el booleano contrario:

if (!(err is ThreadAbortException)) 
+0

1: Esta es la forma normal, pero los bloques de captura tienen una mejor manera. – Richard

2

Usted debe ser capaz de hacer algo como esto:

catch (Exception err){ 
    if (!(err is ThreadAbortException)) { 
    //Code 
    } 
} 
+0

Una razón por la que es posible que desee "atrapar" tipos de excepción separados es que puede usar un bloque 'finally' diferente para cada tipo de excepción. Quizás algunas excepciones no sean recuperables (limpie sus recursos en el bloque finally si se producen estas excepciones) mientras que otras son recuperables (deja intactos los recursos y permite que la persona que llama lo resuelva). –

7

Lo más probable es lo que se debe hacer en esta circunstancia es:

try 
{ 
    // Do Something 
} 
catch (ThreadAbortException threadEx) 
{ 
    // Do something specific 
} 
catch (Exception ex) 
{ 
    // Do something more generic 
} 

Puede tener varias catch bloques para un try . Siempre asegúrese de pedirlos de modo que el más específico esté en la parte superior, y el más genérico (catch (Exception ex)) es el último porque el orden de búsqueda es de arriba a abajo, por lo que si coloca el catch (Exception ex) primero, siempre será el único correr.

1

Lee tiene la mejor respuesta.

Solo para agregar, siempre debe tomar desde lo más específico hasta lo más general. En su caso, el ThreadAbortException es el más específico, así que trate con eso primero.

2

Tal vez usted está buscando para este:

if(err.GetType() != typeof(ThreadAbortException)) 
{ 

} 

Pero recomiendan fuertemente mediante una instrucción de captura separado, según lo sugerido por Lee.

catch(ThreadAbortException ex) 
{ 

} 
catch(Exception ex) 
{ 

}