Gestione delle eccezioni in C# con esempio

Gestione delle eccezioni in C# con esempio

Le eccezioni sono errori imprevisti generati dal CLR. È molto comune che durante l'esecuzione della tua applicazione incontri qualche errore e in seguito lo risolvi conoscendo il motivo alla base. Ci sono un sacco di eccezioni predefinite nel framework DotNet come FileNotFound, DivideByZero, FormatException ecc. Tuttavia, il nome di queste eccezioni è praticamente informativo per l'utente finale, ma la maggior parte degli utenti non sa nemmeno cosa significano effettivamente. È responsabilità dello sviluppatore correggere tutti questi errori eseguendo il debug dell'applicazione e fornire alcune informazioni significative all'utente finale.

Ci sono numerosi motivi per cui dovresti gestire queste eccezioni. Queste eccezioni possono rivelare alcune delle informazioni codificate all'utente finale, di cui non vuoi che sia a conoscenza. Ad esempio, un'applicazione che si connette al server utilizzando nome utente e password codificati può generare un'eccezione se il server non viene trovato o il server è occupato. Inoltre, se l'applicazione genera un'eccezione, l'esecuzione del programma si interrompe a quel punto, il che significa che l'applicazione non sarà in grado di rilasciare alcuna risorsa relativa al sistema. Un esempio molto comune per questo scenario è la classe StreamReader e StreamWriter.

Per gestire tali eccezioni, utilizziamo il blocco Try and Catch. Il blocco Try contiene un pezzo di codice, che vogliamo eseguire e il blocco Catch contiene il codice, che vogliamo eseguire in caso di eccezione per fornire informazioni significative all'utente finale sotto forma di messaggio. Puoi anche scrivere un codice per generare un registro per quell'eccezione, in modo che l'utente possa inviartelo e ti aiuterà a tenere traccia dell'errore. La classe Exception contiene alcune proprietà come Message, StackTrace ecc., che ti aiuteranno a ottenere alcune informazioni relative sull'errore. StackTrace ti fornirà le informazioni su quale riga si è verificato l'errore nel file di codice. Il messaggio ti fornirà le stesse informazioni di base sull'errore. Per visualizzare tutte le eccezioni predefinite del framework dotnet, puoi utilizzare la scorciatoia da tastiera CTRL+ALT+E.

Esempio di eccezione DivideByZero

using System;

namespace Hello
{  
   
    class Program
    {
        static void Main(string[] args)
        {

            int num1 = 10;
            int num2 = 0;

            try
            {
                int num3 = num1 / num2;

                Console.WriteLine(num3);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);   

            }
                       
        }            
    }
}

 Risultato:

Tutte le eccezioni ereditano direttamente o indirettamente dalla classe Exception. Per gestire l'eccezione DivideByZero, puoi usarla direttamente con il suo nome nel blocco Catch. Puoi anche creare più blocchi catch per gestire diversi tipi di eccezioni. Il punto molto importante da ricordare qui è che usi sempre la classe Exception nell'ultimo blocco Catch per gestire tutte le altre eccezioni generali. Se lo usi nel primo blocco Catch, non raggiungerà mai il blocco Catch successivo e se lo fai si verificherà anche un errore in fase di compilazione.

using System;

namespace Hello
{  
   
    class Program
    {
        static void Main(string[] args)
        {

            int num1 = 10;
            int num2 = 0;

            try
            {
                int num3 = num1 / num2;

                Console.WriteLine(num3);

            }
            catch (DivideByZeroException dv)
            {
                Console.WriteLine(dv.Message); 
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message); 
            }
                       
        }            
    }
}

Dopo il blocco Prova e cattura, c'è un altro blocco chiamato Blocco finale. Dopo aver riscontrato un'eccezione, l'esecuzione del programma verrà interrotta, ma qualsiasi codice all'interno del blocco Infine verrà sempre eseguito, indipendentemente dal numero di eccezioni presenti. Infine, il blocco viene normalmente utilizzato per chiudere gli handle di altre classi come StreamReader, StreamWriter ecc. e rilasciare risorse relative al sistema associate a tali classi. Il punto da ricordare qui è che devi controllare se la variabile di riferimento è nulla o meno prima di chiudere l'handle.
using System;

namespace Hello
{  
   
    class Program
    {
        static void Main(string[] args)
        {

            int num1 = 10;
            int num2 = 0;

            try
            {
                int num3 = num1 / num2;

                //Not Executed
                Console.WriteLine(num3);

            }
            catch (DivideByZeroException dv)
            {
                Console.WriteLine(dv.Message); 
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message); 
            }
            finally
            {
                //Executed
                Console.WriteLine("This is Finally block");
            }
                       
        }            
    }
}

 Risultato: