À proximité de la ressource tranquillement utilisation de try-with-resources
Est-il possible d'ignorer l'exception levée lorsqu'une ressource est fermée à l'aide d'un try-with-resources déclaration?
Exemple:
class MyResource implements AutoCloseable{
@Override
public void close() throws Exception {
throw new Exception("Could not close");
}
public void read() throws Exception{
}
}
//this method prints an exception "Could not close"
//I want to ignore it
public static void test(){
try(MyResource r = new MyResource()){
r.read();
} catch (Exception e) {
System.out.println("Exception: " + e.getMessage());
}
}
Ou devrais-je continuer à se refermer dans un finally
à la place?
public static void test2(){
MyResource r = null;
try {
r.read();
}
finally{
if(r!=null){
try {
r.close();
} catch (Exception ignore) {
}
}
}
}
Vous devez vous connecter pour publier un commentaire.
J'ai trouvé cette réponse sur la pièce-dev mailing list:
http://mail.openjdk.java.net/pipermail/coin-dev/2009-April/001503.html
Vous pouvez utiliser un décorateur patron ici pour fermer la ressource tranquillement:
Je ne suis pas personnellement fan de la syntaxe, mais peut-être ce qui fonctionne pour vous:
Vous pouvez faire mieux, si vous êtes prêt à vous limiter à traiter avec des interfaces et de l'effet de levier d'une Dynamique de la Classe Proxy:
Ensuite, en supposant que vous avez:
Avec une véritable ressource de classe:
Syntaxe d'appel ressemblerait à:
Vous pouvez faire mieux que ça si vous voulez commencer à y compris les bibliothèques, comme les AOP catalyseurs. Ces solutions, cependant, sera de travailler hors de la boîte avec JDK7 et pas d'autres dépendances.
throws Exception
declose()
de document de la prirent d'exception et de simplifier l'utilisation.C'est une solution:
Si
ok==true
et nous avons eu une exception, il vient définitivement declose()
.Si
ok==false
,e
vient deread()
ou d'un constructeur.close()
sera toujours appelé et peut jetere2
, mais e2 sera supprimé de toute façon.Le code est lisible sans l'intermédiaire d'une telle analyse. Intuitivement, il est dit, si
ok==true
, notre vrai travail est fait, et nous n'avons pas vraiment attention à ce que les erreurs viennent après que le sujet de la ressource.