2015-12-18 5 views
4

Je dois séparer SQLExceptions selon ErrorCode. J'ai la déclaration suivante if dans catch block mais la condition else est toujours imprimée.Java SQLException séparé selon le code d'erreur

catch (SQLException ex) { 

     if (ex.getErrorCode() == 28502){ 
     System.out.println("Username Problem"); 
     } 

     else{ 
     System.out.println("Other Problem"); 
     } 

    Logger.getLogger(FirstTimeMainFrame.class.getName()).log(Level.SEVERE, null, ex); 

} 

En fait, quand je rentre inattendue username lors de la création DB, les SQLExceptions suivants sont jetés.

java.sql.SQLException: Failed to create database 'myDB', see the next exception for details. 
//rest of exception. 
Caused by: ERROR XJ041: Failed to create database 'myDB', see the next exception for details. 
//rest of exception. 
Caused by: ERROR XBM01: Startup failed due to an exception. See next exception for details 
//rest of exception. 
Caused by: ERROR 28502: The user name 'AAA.AAA' is not valid. 
//rest of exception. 

Mais mon catch est toujours imprimer Other Problem. Comment puis-je séparer différents SQLExceptions selon le dernier ErrorCode?

+1

A en juger par l'exception, il est en fait la troisième exception qui a enchaîné ce code, essayez donc traverser la chaîne en utilisant 'ex.getNextException()'. Boucle jusqu'à ce que «null» ou vous trouvez le code d'erreur désiré. – blm

+0

pouvez-vous simplement faire un System.out.println (ex.getErrorCode())? cela peut clairement vous dire quel est le code retourné – zerocool

+0

@zerocool il renvoie '40000' –

Répondre

1

--- --- SOLVED

Merci pour les commentaires routés pour @blm premier.

Trick est; Autre à venir Exceptions (1er et 2ème) a String valeurs dans leur SQLState seule valeur numérique dans leur ErrorCode.

SQLException 3ème chaîne exception a 28502 à la fois SQLState et ErrorCode. C'est la différence entre le 1er et le 2ème Exceptions je pense.

j'ai donc changé mon

Catch bloc;

catch (SQLException se) { 

     do { 

     if(se.getSQLState().equals("28502")){ 
      System.out.println("Username Problem"); 
     } 

     else{ 
      System.out.println("Other Problem"); 
     } 

     } while ((se = se.getNextException()) != null); 

} 

sortie est;

Other Problem 
Other Problem 
Username Problem 
+0

Je suis content que vous ayez trouvé une approche qui fonctionne pour vous. Vous pouvez consulter https://issues.apache.org/jira/browse/DERBY-6779 et éventuellement déposer un problème lié décrivant votre scénario et la solution de contournement que vous deviez utiliser, afin que l'équipe de Derby puisse enquêter pour faciliter ce processus. A l'avenir. –

0

Vous devriez obtenir les exceptions de cause en utilisant la méthode 'getCause()' de l'objet SqlExeption intercepté. Ensuite, vous pouvez convertir le résultat en Exception et vérifier son code d'erreur.
vérifier cela pour plus d'informations: Throwable.getCause()

Edit:

SQLException temp = ex; 
while(temp.getCause() != null) 
{ 
    temp = (Exception)temp.getCause(); 
} 
// check if temp is SQLException and if it is check ((SQLException)temp).getErrorCode() == whatever you want 
+0

'getCause()' renvoie 'ERREUR XJ041: Impossible de créer la base de données 'myDB', voir l'exception suivante pour plus de détails.' Nous devons suivre la chaîne je pense. Mais comment. –

+0

droite, et puis vous devriez continuer à l'appeler jusqu'à ce que vous obtenez à celui avec le bon code de statut –

+0

Mais errorcode exacte montrera toujours la dernière en chaîne pour 'SQLExceptions' je ne sais pas. –