4 ■ Différences en Java et C#
2.10 Levée et capture d'exceptions
Les exceptions en C# et Java partagent énormément de caractéristiques. Les deux
langages supportent l'utilisation de l'ordre try pour indiquer qu'un bloc est susceptible de
lever une exception et catch pour capturer l'exception en question. De plus, finally est
implémenté de la même manière pour spécifier qu'une région de code doit, dans tous les cas
être exécutée (exception ou pas). Cela permet de libérer des ressources proprement. Les deux
langages proposent une hiérarchie de classes d'exceptions dérivant d'une super classe :
System.Exception pour C# et java.lang.Exception pour Java. Aussi, il est possible de
chaîner la levée ou la capture d'exception (throw dans un catch) de part et d'autre. Cela
permet, lors de la levée d'une exception, de retourner à l'appelant un type d'exception
correspondant à son contexte et à sa couche d'architecture. Par exemple, une ligne non
trouvée dans une table se traduira par une SQLException que le développeur prendra soin
de renvoyer à l'interface graphique sous la forme d'un ObjectNotFoundException.
Remarque : Cependant, il existe une différence fondamentale entre C# et Java. Comme
en Python, le mot-clé throws n'existe pas en C# car vous n'êtes pas contraint de spécifier
dans la signature d'une méthode le fait qu'elle est susceptible de lever une exception. Il n'y a,
contrairement à Java, aucune vérification de faite à l'exécution.
Code Java
class MyException extends Exception{
public MyException(String message){ super(message); }
public MyException(String message, Exception innerException){
super(message, innerException); }
}
public class ExceptionTest {
static void doStuff(){
throw new ArithmeticException();
}
public static void main(String[] args) throws Exception{
try{
try{
doStuff();
return; // Ne sera pas exécuté
} catch(RuntimeException e) { // parent de ArithmeticException
throw new MyException("MyException levée", e);
}
} finally {
System.out.println("***Block executé même si MyException est
lévée");
}
}
}
Code C#
class MyException: Exception {
public MyException(string message): base(message){ }
public MyException(string message, Exception innerException):
base(message, innerException){ }
}
public class ExceptionTest {
ENSICAEN - Spécialité Informatique