Exceptions (C# et Java)

Mise à jour : novembre 2007

La gestion des exceptions est très semblable en C# et Java.

Chaque fois que quelque chose se passe très mal dans l'exécution d'un programme, le common language runtime (CLR) du .NET Framework crée un objet Exception qui détaille l'erreur. Dans le .NET Framework, Exception est la classe de base pour toutes les classes d'exception. Il y a deux catégories d'exceptions qui dérivent de la classe Exception, SystemException et ApplicationException. Tous les types de l'espace de noms System dérivent de SystemException alors que les exceptions définies par l'utilisateur doivent dériver de ApplicationException pour distinguer les erreurs d'exécution des erreurs d'application. Certaines exceptions System communes comprennent :

  • IndexOutOfRangeException : un index supérieur à la taille d'un tableau ou d'une collection est utilisé.

  • NullReferenceException : une propriété ou méthode d'une référence a été utilisée avant que cette référence ait eu pour valeur une instance valide.

  • ArithmeticException : une opération produit un dépassement de capacité positif ou négatif.

  • FormatException : un argument ou un opérande est de format incorrect.

Comme en Java, lorsque vous avez un code qui est susceptible de provoquer une exception, vous placez ce code dans un bloc try . Un ou plusieurs blocs catch placés immédiatement après assurent la gestion des erreurs, et vous pouvez également utiliser un bloc finally pour tout code que vous souhaitez exécuter, qu'une exception soit levée ou pas. Pour plus d'informations, consultez try-catch (Référence C#) et try-catch-finally (Référence C#).

Lorsque vous utilisez plusieurs blocs catch, les exceptions interceptées doivent être placées en ordre de généralité croissante, car seul le premier bloc catch correspondant à l'exception levée sera exécuté. Le compilateur C# appliquera cette règle, mais pas le compilateur Java.

Par ailleurs, contrairement à Java, C# ne nécessite pas d'argument pour un bloc catch. En l'absence d'argument, le bloc catch s'applique à n'importe quelle classe Exception.

Par exemple, pendant la lecture d'un fichier, vous pouvez rencontrer un FileNotFoundException ou un IOException, et souhaiter placer en premier le gestionnaire FileNotFoundException plus spécifique, comme le montre le code suivant :

try
{
    // code to open and read a file
}
catch (System.IO.FileNotFoundException e)
{
    // handle the file not found exception first
}
catch (System.IO.IOException e)
{
    // handle any other IO exceptions second
}
catch
{
    // a catch block without a parameter
    // handle all other exceptions last
}
finally
{
    // this is executed whether or not an exception occurs
    // use to release any external resources
}

Vous pouvez créer vos propres classes d'exceptions par une dérivation à partir de Exception. Par exemple, le code suivant crée une classe InvalidDepartmentException que vous pouvez lever si, par exemple, le département donné pour un nouvel Employee n'est pas valide. Le constructeur de classe pour votre exception définie par l'utilisateur appelle le constructeur de classe de base à l'aide du mot clé base, en envoyant un message approprié :

public class InvalidDepartmentException : System.Exception
{
    public InvalidDepartmentException(string department) : base("Invalid Department: " + department)
    {
    }
}

Vous pourriez lever ensuite une exception avec un code tel que :

class Employee
{
    private string department;

    public Employee(string department)
    {
        if (department == "Sales" || department == "Marketing")
        {
            this.department = department;
        }
        else
        {
            throw new InvalidDepartmentException(department);
        }
    }
}

C# ne prend pas en charge les exceptions vérifiées. En Java, celles-ci sont déclarées à l'aide du mot clé throws, pour spécifier qu'une méthode peut lever un type particulier d'exception devant être gérée par le code appelant.

Voir aussi

Concepts

Guide de programmation C#

Référence

Exceptions et gestion des exceptions (Guide de programmation C#)

Autres ressources

Langage de programmation C# pour les développeurs Java