C# Language Utiliser l'objet exception


Exemple

Vous êtes autorisé à créer et à lancer des exceptions dans votre propre code. L'instanciation d'une exception se fait de la même manière que tout autre objet C #.

Exception ex = new Exception();

// constructor with an overload that takes a message string
Exception ex = new Exception("Error message"); 

Vous pouvez ensuite utiliser le mot-clé throw pour déclencher l'exception:

try
{
    throw new Exception("Error");
}
catch (Exception ex)
{
    Console.Write(ex.Message); // Logs 'Error' to the output window
} 

Remarque: Si vous lancez une nouvelle exception dans un bloc catch, vérifiez que l'exception d'origine est transmise en tant qu '"exception interne", par exemple

void DoSomething() 
{
    int b=1; int c=5;
    try
    {
        var a = 1; 
        b = a - 1;
        c = a / b;
        a = a / c;
    }        
    catch (DivideByZeroException dEx) when (b==0)
    {
        // we're throwing the same kind of exception
        throw new DivideByZeroException("Cannot divide by b because it is zero", dEx);
    }
    catch (DivideByZeroException dEx) when (c==0)
    {
        // we're throwing the same kind of exception
        throw new DivideByZeroException("Cannot divide by c because it is zero", dEx);
    }
}

void Main()
{    
    try
    {
        DoSomething();
    }
    catch (Exception ex)
    {
        // Logs full error information (incl. inner exception)
        Console.Write(ex.ToString()); 
    }    
}

Dans ce cas, il est supposé que l'exception ne peut pas être gérée mais certaines informations utiles sont ajoutées au message (et l'exception d'origine peut toujours être accédée via ex.InnerException par un bloc d'exception externe).

Il montrera quelque chose comme:

System.DivideByZeroException: impossible de diviser par b car il est zéro ---> System.DivideByZeroException: tentative de division par zéro.
à UserQuery.g__DoSomething0_0 () dans C: [...] \ LINQPadQuery.cs: ligne 36
--- Fin de trace de pile d'exception interne ---
à UserQuery.g__DoSomething0_0 () dans C: [...] \ LINQPadQuery.cs: ligne 42
à UserQuery.Main () dans C: [...] \ LINQPadQuery.cs: ligne 55

Si vous essayez cet exemple dans LinqPad, vous remarquerez que les numéros de ligne ne sont pas très significatifs (ils ne vous aident pas toujours). Cependant, le fait de transmettre un texte d'erreur utile, comme suggéré ci-dessus, réduit considérablement le temps nécessaire pour localiser l'erreur, ce qui est clairement dans cet exemple la ligne

c = a / b;

dans la fonction DoSomething() .

Essayez-le avec .NET Fiddle