0

Pour un projet que je travaille, nous avons quelques blocs qui ressemblent à ceci:Remplacement d'exceptions génériques avec des types d'exceptions plus spécifiques?

Classe A:

try { 
    callSomeMethod(); 
} 
catch (Exception e) { 
    throw new SomeCustomExceptionTypeForMetrics(""); 
} 

Cependant, je suis chargé de remplacer tous les cas où nous attrapons des exceptions génériques avec seulement les types d'exceptions "attendus" spécifiques.

Le problème est callSomeMethod() a quelque chose comme ça

Classe B:

try { 
    if (someCondition...) { 

    } 
    else { 
     //failed 
     throw new RuntimeException("Timeout while waiting for results") 
    } 
} 
catch(InterruptedException e) { 
    // do some failure stuff here 
    throw new RuntimeException("Something here"); 
} 

Idéalement, mon groupe m'a demandé de changer peu que possible, et je ne peux pas changer la signature pour callSomeMethod(), mais ils ne veulent pas non plus attraper une exception RuntimeException dans la classe A puisqu'ils ne veulent pas capturer n'importe quel type d'exception RuntimeException - seulement ceux que nous excluons de la classe B.

Quelle est la meilleure façon de gérer cela?

+2

Remplacez ces 'RuntimeExeption's par quelque chose de plus spécifique. Créez des classes personnalisées si nécessaire. –

+0

Ai-je bien compris: Vous êtes censé attraper RuntimeExceptions mais seulement si elles ont explicitement été lancées dans la classe B dans le code java avec "throw new RuntimeException()" tout en ignorant celles qui pourraient provenir d'ailleurs? –

+0

Est-ce que modifier la classe B est une option? – slambeth

Répondre

0

votre signature en supposant que l » callSomeMethod contient throws Exception, et vous ne pouvez pas le changer: Changer les RuntimeException s dans la méthode à une classe personnalisée Exception, puis en classe A:

try { 
    callSomeMethod(); 
} 
catch (Exception e) { 
    if(e instanceof CustomException) 
     //Log it or something, for metrics? 
} 

C'est un peu stupide, mais pourrait être nécessaire si vous ne pouvez pas changer la signature de la méthode. (Si vous pouvez le changer, vous pouvez attraper le CustomException directement.) Vous pouvez même créer une méthode dans votre enregistreur qui prend un Exception, vérifie de quel type il s'agit et agit en conséquence. Ensuite, utilisez simplement cette méthode dans chaque instruction catch que vous devez éditer. Lors de la conception de cette solution, gardez à l'esprit qu'il n'est pas nécessaire de détecter les RuntimeException s. Cela pourrait vous éviter des problèmes.

0

Si vous chnage votre code dans la classe B comme ci-dessous

try { 
     if (someCondition...) { 

     } 
     else { 
      //failed 
      throw new MyRuntimeException("Timeout while waiting for results") 
     } 
    } 
    catch(InterruptedException e) { 
     // do some failure stuff here 
     throw new MyRuntimeException("Something here"); 
    } 

et de définir MyRuntimeException comme:

class MyRuntimeException extends RuntimeException{ 
.. 
} 

Dans la classe A, il vous suffit de prendre MyRuntimeException exception.

Espérons que cela résoudra votre problème !!