C# Language Utilizzando l'oggetto eccezione


Esempio

È consentito creare e generare eccezioni nel proprio codice. L'istanziazione di un'eccezione viene eseguita allo stesso modo di qualsiasi altro oggetto C #.

Exception ex = new Exception();

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

È quindi possibile utilizzare la parola chiave throw per aumentare l'eccezione:

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

Nota: se stai lanciando una nuova eccezione all'interno di un blocco catch, assicurati che l'eccezione originale sia passata come "eccezione interna", ad es

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()); 
    }    
}

In questo caso si presume che l'eccezione non possa essere gestita, ma alcune informazioni utili vengono aggiunte al messaggio (e l'eccezione originale può ancora essere letta tramite ex.InnerException da un blocco di eccezioni esterno).

Mostrerà qualcosa come:

System.DivideByZeroException: Non può dividere per b perché è zero ---> System.DivideByZeroException: Tentativo di divisione per zero.
a UserQuery.g__DoSomething0_0 () in C: [...] \ LINQPadQuery.cs: riga 36
--- Fine della traccia dello stack delle eccezioni interne ---
a UserQuery.g__DoSomething0_0 () in C: [...] \ LINQPadQuery.cs: riga 42
a UserQuery.Main () in C: [...] \ LINQPadQuery.cs: riga 55

Se stai provando questo esempio in LinqPad, noterai che i numeri di riga non sono molto significativi (non sempre ti aiutano). Tuttavia, il passaggio di un testo di errore utile come suggerito sopra spesso riduce significativamente il tempo necessario per rintracciare la posizione dell'errore, che in questo esempio è chiaramente la linea

c = a / b;

in funzione DoSomething() .

Provalo su .NET Fiddle