2016-03-14 4 views
5

Ho il seguente codice JavaQual è la differenza tra gestione delle eccezioni da blocco catch classe direttamente genitore e sottoclassi

import org.testng.annotations.Test; 

@Test 
public void testException(){ 
    try{ 
     Assert.assertEquals(1,2); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

Quando viene eseguito il test, l'asserzione non riesce e l'eccezione viene stampata come standard output e il TestNG mostra il risultato del test come FAILED.

Se prendo la stessa eccezione utilizzando

catch(AssertionError e){ 
    e.printStackTrace(); 
} 

l'eccezione viene stampata come uscita di errore e il TestNG mostra il risultato del test come passato. In entrambi i casi viene gestita l'eccezione, ma qual è la differenza qui?

risposta

6

AssertionError non è una sottoclasse di Exception (si tratta di una sottoclasse di Error), per cui il primo frammento di, con il gestore catch(Exception e), non prenderlo. Pertanto il risultato del test è FALLITO.

Il secondo frammento cattura l'eccezione, quindi fino ad un TestNG interessato, non si sono verificate eccezioni nel test di testException() e il risultato è PASSATO.

2

Perché AssertionError è figlio di Throwable e Error, non dal Exception:

java.lang.Object 
    java.lang.Throwable 
     java.lang.Error 
      java.lang.AssertionError 

Così la linea:

catch(Exception e){ 

non prenderà nel caso di errore. Che cosa si può fare è:

catch(Error e){ 

o

catch(Throwable t){ 

Ma si deve fare attenzione a come explained here