Quindi, ecco la mia pretesa di fama. Qui, stiamo camminando lungo lo StackTrace, cercando il metodo di origine dell'eccezione.
public class ExceptionOriginTracing {
public static void main(String[] args){
try {
originOne();
originTwo();
} catch (Exception e){
// Now for the magic:
for (StackTraceElement element : e.getStackTrace()){
if (element.getMethodName().equals("originOne")){
System.out.println("It's a read error!");
break;
} else if (element.getMethodName().equals("originTwo")){
System.out.println("It's a write error!");
break;
}
}
}
}
public static void originOne() throws Exception{
throw new Exception("Read Failed...", null);
}
public static void originTwo() throws Exception{
throw new Exception("Connect failed...", null);
}
}
La differenza per l'analisi del messaggio proposta dal eccezione è, che una semplice stringa è più propensi a cambiare, che il nome del metodo attuale.
A parte questo, questa non è una soluzione ottimale! Ma purtroppo non esiste una soluzione ottimale qui.
Inoltre, con questo approccio, cura supplementare deve essere presa quando l'offuscamento di origine viene utilizzato, che cambierà il metodo nomi e per questo il valore di ritorno di getMethodName()
.
Il modo giusto quando progettando qualcosa di simile sarebbe quello di avvolgere l'eccezione in una nuova eccezione, che ha fornito i metodi per scoprire in realtà l'origine reale usando una bandiera o un enum.
Analizzare un messaggio/StackTrace si sente sempre sporco ed è subtable da interrompere nelle versioni future!
fonte
2013-03-01 22:27:26
Molto buono da chiedere prima! In genere, è una cattiva idea analizzare i messaggi. Hai controllato se puoi usare 'getCause()' per vedere cosa sta causando l'eccezione? –
Inoltre, esiste anche un campo 'bytesTransferred'. Controlla se questo cambia in base alla causa dell'eccezione. –
Uno è lanciato da 'connect()' uno è lanciato da un 'read()' ... non hai * * * per distinguere tra i due. –