J'ai besoin d'un code pour être déclenché si une erreur se produit. Fondamentalement, j'ai besoin d'un bloc finally
qui s'exécute uniquement en cas d'exception. Je mettre en œuvre ainsi:Comment implémenter `finally` pour un cas d'erreur en Java
HttpURLConnection post(URL url, byte[] body) throws IOException {
HttpURLConnection connection = url.openConnection();
try {
OutputStream out = connection.getOutputStream();
try {
out.write(body);
} finally {
out.close();
}
return connection;
} catch (Throwable t) {
connection.disconnect();
throw t;
}
}
Attend fin, sauf qu'il ne compilera pas: ma fonction ne peut pas jeter Throwable
.
Je pourrais réécrire:
} catch (RuntimeException e) {
connection.disconnect();
throw e;
} catch (IOException e) {
connection.disconnect();
throw e;
}
Mais je suis) manque toutes les erreurs et b) doivent fixer ce code chaque fois que je change ma mise en œuvre de lancer différents types d'exceptions.
Est-il possible de gérer cela génériquement?
Les exceptions ne sont-elles pas vérifiées juste * fantastique? * – cdhowie
@cdhowie: Je n'aime pas non plus les exceptions vérifiées, mais c'est vraiment un cas de Error et Throwable en cours de vérification mais pas vérifié; rien dans le runtime ne déclare "thrx XxxError", mais si vous essayez de (re) lancer XxxError soudainement il est coché - HUH ?? Qu'est-ce qui se passe avec ça? Les exceptions vérifiées devraient avoir été faites avec une sous-classe CheckedException de Throwable qui est vérifiée par le compilateur, pas la "magie" actuelle - bien sûr qui me permet de renvoyer une exception vérifiée comme Throwable, mais je ne suis pas sûr que ce soit un tel mauvaise chose. –
@Software Monkey: en fait 'Error' n'est pas coché - je viens de le vérifier. :) Vous pouvez certainement attraper et relancer 'Error' sans le mentionner dans la clause' throws'.Cela ajouterait un autre cas à ma solution, le rendant encore moins facile à maintenir. La réalité est que, au lieu de CheckedException, Java va avec deux arbres non contrôlés, RuntimeException et Error, avec tout le reste à vérifier. – SnakE