Condividi tramite


Eccezioni (confronto tra C# e Java)

Aggiornamento: novembre 2007

In C# le eccezioni vengono gestite in modo del tutto analogo a Java.

Ogni volta che si verifica un problema critico durante l'esecuzione di un programma, Common Language Runtime (CLR) di .NET Framework crea un oggetto Exception in cui vengono forniti i dettagli sull'errore. In .NET Framework Exception è la classe base di tutte le classi di eccezione. Le categorie di eccezioni che derivano dalla classe Exception sono due, SystemException e ApplicationException. Tutti i tipi nello spazio dei nomi System derivano da SystemException, mentre le eccezioni definite dall'utente devono derivare da ApplicationException in modo da differenziare gli errori della fase di esecuzione da quelli dell'applicazione. Di seguito sono riportate alcune eccezioni System comuni.

  • IndexOutOfRangeException: viene utilizzato un indice maggiore della dimensione di una matrice o di un insieme.

  • NullReferenceException: è stata utilizzata una proprietà o un metodo di un riferimento prima che il riferimento venisse impostato su un'istanza valida.

  • ArithmeticException: un'operazione determina un overflow o un underflow.

  • FormatException: un argomento o un operando ha un formato non corretto.

Analogamente a Java, quando si dispone di codice che può causare un'eccezione, è opportuno inserire tale codice in un blocco try . Uno o più blocchi catch immediatamente successivi rendono possibile la gestione degli errori. È inoltre possibile utilizzare un blocco finally per il codice da eseguire, indipendentemente dal fatto che venga generata un'eccezione. Per ulteriori informazioni, vedere try-catch (Riferimenti per C#) e try-catch-finally (Riferimenti per C#).

Quando si utilizzano più blocchi catch, le eccezioni rilevate devono essere inserite in ordine di genericità crescente, poiché verrà eseguito solo il primo blocco catch corrispondente all'eccezione generata. A differenza del compilatore Java, il compilatore C# impone questa procedura.

Inoltre, a differenza di Java, C# non richiede un argomento per un blocco catch. In mancanza di un argomento, il blocco catch viene applicato a qualsiasi classe Exception.

Ad esempio, durante un'operazione di lettura da un file, può verificarsi un'eccezione FileNotFoundException o IOException. In questo caso è opportuno inserire per primo il gestore FileNotFoundException più specifico, come illustrato nel codice seguente:

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
}

È possibile creare classi di eccezione personalizzate derivandole dall'oggetto Exception. Nel codice riportato di seguito viene creata una classe InvalidDepartmentException che può essere generata se ad esempio il reparto specificato per il record del nuovo Employee non è valido. Il costruttore della classe per l'eccezione definita dall'utente chiama il costruttore della classe base tramite la parola chiave base, inviando un messaggio appropriato:

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

È quindi possibile generare un'eccezione utilizzando codice simile a quello riportato di seguito:

class Employee
{
    private string department;

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

C# non supporta le eccezioni verificate. In Java le eccezioni di questo tipo vengono dichiarate utilizzando la parola chiave throws per specificare che un metodo può generare un particolare tipo di eccezione che deve essere gestito dal codice chiamante.

Vedere anche

Concetti

Guida per programmatori C#

Riferimenti

Eccezioni e gestione delle eccezioni (Guida per programmatori C#)

Altre risorse

Linguaggio di programmazione C# per sviluppatori Java