2010-03-04 1 views
14

Non riesco a trovare l'operatore "non è" in C#. Ad esempio, ho il codice sotto il quale non funziona. Devo controllare che err non sia di tipo ThreadAbortException.NON è operatore in C#

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

Grazie, le risposte entrambi stanno lavorando;) – Tomas

+0

Si potrebbe fare questo: se non object.ReferenceEquals (err.GetType(), GetType (ThreadAbortException)) Then –

risposta

35

Basta cambiare il blocco catch a:

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

modo da poter gestire ThreadAbortExceptions e tutti gli altri separatamente.

+1

Questa è una soluzione migliore per la situazione attuale. +1 –

+2

Wow, era vicino. Odio vedere '! (A is B)' ovunque! – ChaosPandion

+0

Guardare il frammento di codice nella domanda mi rendeva davvero confuso, era se avessi dimenticato come rilevare le eccezioni. Questo è il modo corretto in effetti. – Finglas

33

In questo caso, avvolgere e controllare il booleano opposto:

if (!(err is ThreadAbortException)) 
+0

1: Questo è il modo normale, ma prendere blocchi ha un modo migliore. – Richard

2

Si dovrebbe essere in grado di fare qualcosa di simile:

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

Un motivo per cui si potrebbe desiderare di "catturare" tipi di eccezioni separati è che è possibile utilizzare un diverso blocco "finally' su ciascun tipo di eccezione. Forse alcune eccezioni non sono recuperabili (si puliscono le risorse nel blocco finally se si verificano queste eccezioni) mentre altre sono recuperabili (si lasciano le risorse intatte e si consente al chiamante di risolverlo). –

7

Più che probabile che cosa si dovrebbe fare in questa circostanza è:

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

Si possono avere più catch blocchi per un try . Assicurati sempre di ordinarli in modo che il più specifico sia in cima e il più generico (catch (Exception ex)) sia l'ultimo perché l'ordine di ricerca è dall'alto al basso, quindi se inserisci prima lo catch (Exception ex), sarà sempre l'unico a correre.

1

Lee ha la migliore risposta.

Solo per aggiungere, si dovrebbe sempre prendere dal più specifico al più generale. Nel tuo caso lo ThreadAbortException è il più specifico, quindi affrontalo per primo.

2

Forse siete alla ricerca di questo:

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

} 

Ma io consiglio vivamente utilizzando un'istruzione catch separata, come suggerito da Lee.

catch(ThreadAbortException ex) 
{ 

} 
catch(Exception ex) 
{ 

}