Je pensais que IOException et FileNotFoundException sont exactement ce genre d'exceptions
Nope, ce sont en fait les « autres » types d'exceptions, le genre qui vont au-delà de vos compétences en programmation. Quel que soit le niveau de programmation, le compilateur et les bibliothèques vous rendent "conscient" que quelque chose peut arriver.
Pensez à ce scénario:
Vous créez une application qui enregistre les données dans un dossier temporaire.
Tout va bien, vous avez vérifié que le dossier existe, et sinon, vous le créez vous-même.
Ensuite, vous écrivez 2 Mo dans ce dossier temporaire. Soudain, d'autres processus du système, supprime votre dossier temporaire, et vous ne pouvez plus écrire.
Il n'y a rien que vous pouvez faire pour empêcher cela par programme, dans certains systèmes, cette opération pourrait se produire (Dans unix, l'utilisateur root peut effectuer rm -rf/tmp et vous ne pouvez rien y faire. En vous obligeant à vérifier ce type d'exceptions dans le code, les concepteurs de la plate-forme pensaient qu'au moins vous en étiez conscient.
Jon is correct parfois il n'y a rien que vous pouvez faire à ce sujet, l'exploitation forestière probablement avant que le programme meurt, qui est considéré comme « gérer l'exception » (mauvaise poignée oui, mais gérer au moins)
try {
....
} catch(IOException ioe) {
logger.severe(
String.format("Got ioe while writting file %s. Data was acquired using id = %d, the message is: %s",
fileName,
idWhereDataCame,
ioe.getMessage()));
throw ioe;
}
Une autre chose vous pouvez faire est de "chaîner" l'exception pour s'adapter à l'abstraction.
Probablement votre application, est dotée d'une interface graphique, montrant une exception d'E/S à l'utilisateur ne signifie rien ou pourrait être un security vulnerability. Un message modifié pourrait être envoyé.
try {
....
} catch(IOException ioe) {
throw new EndUserException("The operation you've requeste could not be completed, please contact your administrator" , ioe);
}
Et le EndUserException pourrait être emprisonné quelque part dans l'IUG et présenté à l'utilisateur dans un message de dialogue (au lieu de simplement disparaître l'application dans ses yeux sans plus d'informations). Bien sûr, il n'y avait rien que vous puissiez faire pour récupérer cette IOException, mais au moins vous mourrez avec style: P
Enfin un code client, pourrait utiliser différentes implémentations, et toutes les exceptions n'auraient pas de sens. Par exemple, détrompez-vous sur le premier scénario. Cette même "opération" pourrait avoir trois types de services "plugins" pour effectuer l'enregistrement des données.
a) Write the data to a file.
b) Or, write to a db
c) Or write to a remote server.
L'interface ne doit pas jeter:
java.io.IOException
java.sql.SQLException
ni
java.net.UnknownHostException
Mais au lieu quelque chose comme
my.application.DataNotSavedException
et les différentes implémentations gérerait l'exception à la bonne niveau, et transformer à l'abstraction appropriée:
Code client:
DataSaver saver = DataServer.getSaverFor("someKeyIdString");
try {
saver.save(myData);
} catch(DataNotSavedException dnse) {
// Oh well... .
ShowEndUserError("Data could not be saved due to : " dnse.getMessage());
}
Code de mise en œuvre:
class ServerSaver implements DataSaver {
....
public void save(Data data) throws DataNotSavedException {
// Connect the remore server.
try {
Socket socket = new Socket(this.remoteServer, this.remotePort);
OuputStream out = socket.getOut....
....
....
} catch (UnknownHostException uhe) {
// Oops....
throw new DataNotSavedException(uhe);
}
}
}
FileSaver et DatabaseSaver ferait quelque chose de similaire.
Tous ces éléments sont Exceptions vérifiées car le compilateur vous invite à les vérifier.
Quand utiliser l'un ou l'autre (cochée/décochée): here
Il existe deux autres types: here
Et enfin une explication beaucoup plus simple du Runtime est: here
Très bon point, et belle réponse. – hotshot309