2009-05-05 3 views
1

J'essaie de lancer une exception ImportException (custom) à partir de la méthode importUsers dans la classe UserHelper. Je peux voir dans le débogueur que la clause throw est exécutée, mais la méthode, à partir de laquelle la méthode importUsers est appelée, n'obtient jamais l'exception.Pourquoi l'exécution du code n'atteint-elle jamais le bloc catch (java)?

Voici la méthode, où l'exception est levée:

public static AccessorValidator importUsers(List<String> data, WebUser actor) throws ImportException { 

    //(irrelevant code removed) 

    try { 
     isSuccess = insertUserData(st, blocks, db, actor); 
    } catch (Exception e) { 
     throw new ImportException("Could not insert user on line " + rowCounter); 
    } 

}

Ici j'essaie en vain d'attraper l'exception levée de méthode d'exécution en classe AccessorValidator:

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, 
     HttpServletResponse response) throws Exception { 
    //(irrelevant code removed) 
    try{ 
     av = UserHelper.importUsers(data, admin); 
     System.out.print("test2"); 
    } catch (ImportException ie) { 
     System.out.print("testE"); 
     returnMessageValue = ie.getMessage(); 
    } catch (Exception e) { 
     System.out.print("testE2"); 
    } 

La sortie est "test2", et l'exécution du code n'atteint jamais l'un des blocs catch. Qu'est-ce que je fais de mal?

+0

UserHelper.importUsers (données, admin); ne lève pas une exception que! –

Répondre

5

essayez de changer votre méthode pour

try { 
    isSuccess = insertUserData(st, blocks, db, actor); 
    system.out.print("after insertUserData"); 
} catch (Exception e) { 
    System.out.print("before throwing"); 
    throw new ImportException("Could not insert user on line " + rowCounter); 
} 

de sorte que vous pouvez vous assurer que ce que vous voyez dans le débogage est ce qui est réellement en cours d'exécution (en cochant la console), et si insertUserData lancers francs en fait une exception ou non.

+0

Merci, cela m'a conduit à la solution. – simon

0

Peut-être que insertUserData() ne génère aucune exception dans votre configuration de test? Il serait utile si cette méthode était également incluse dans votre question ...

+0

C'est le cas. J'ai mentionné que "je peux voir dans le débogueur que la clause throw est exécutée"; plus précisément, je vois dans le débogueur que le code sur la ligne lancer nouvelle ImportException ("Impossible d'insérer l'utilisateur sur la ligne" + rowCounter); est exécutée. – simon

+0

Je n'ai pas ajouté le code de la méthode insertUserData, car l'exception réelle est lancée à plusieurs niveaux, ce serait compliqué à suivre. – simon

1

Si "test2" est imprimé, aucune exception n'est levée par importUsers().

Les informations de ligne dans le débogueur peuvent être inexactes. Essayez de placer un point d'arrêt dans le constructeur de l'exception pour voir s'il est réellement créé.

0

Etes-vous sûr que insertUserData déclenche une exception et renvoie non seulement un booléen vrai/faux? Voir l'étape du débogueur sur une ligne avec un "lancer" ne veut pas dire que quelque chose est lancé, car les informations de ligne ne sont pas toujours complètement précises.

0

Vérifiez les points suivants, par ordre:

  1. Vérifiez que vos points d'arrêt sont synchronisées avec le code source
  2. insertUserData() n'est pas lancer une exception du tout, vérifier si, du tout, il faut lancer une exception ou non. On dirait que vous attendez quelque chose qui ne vient jamais.
  3. Vérifiez que ImportException est en effet le même objet dans les deux cas, vous faites référence
0

Si la sortie est « test2 » alors certainement l'exception n'a pas été levée.

juste deviner ...

Parfois, votre IDE ne peut pas être synchronisé avec le code source qui exécute en fait, surtout si votre code fait partie d'une bibliothèque externe ... Si vous modifiez le code et don de la bibliothèque Ne mettez pas à jour le classpath réel, ou si ce changement se produit pendant le débogage, les lignes de code peuvent changer et vous pouvez voir l'exception à être lancée bien que cela ne se produise pas vraiment.

-1

essayer d'attraper un Throwable, la racine d'erreur et d'exception, avec:

try{ 
     av = UserHelper.importUsers(data, admin); 
     System.out.print("test2"); 
    } catch (ImportException ie) { 
     System.out.print("testE"); 
     returnMessageValue = ie.getMessage(); 
    } catch (Exception e) { 
     System.out.print("testE2"); 
    } catch (Throwable t) { 
     // Here you'll catch *anything* else 
     System.out.print("testTE"); 
    } 
+0

En règle générale, vous ne devez attraper que les exceptions correspondant au niveau auquel vous vous trouvez, alors soyez fatigué des longues chaînes. Cela étant dit parfois ce scénario même nous est imposé ... – CurtainDog

0

Problème résolu. Il semble que le bloc try-catch de la méthode importUsers était entouré d'un autre bloc try-catch, qui ne lançait pas l'exception ImportException. Donc, le premier bloc de capture fonctionnait correctement, j'ai juste raté le second.

Questions connexes