0Pricing
C# Academy · Lezione

Eccezioni personalizzate; progettazione degli errori

Create eccezioni personalizzate semplici, scegliete i tipi integrati corretti (ArgumentException, InvalidOperationException) e aggiungete contesto con InnerException.

Eccezioni personalizzate; progettazione degli errori è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 2 di 3. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 3 lezioni in totale.

Scopo e obiettivi

Obiettivo: rendere gli errori chiari e intercettabili.

  • Utilizzi un tipo specifico per ogni errore specifico
  • Fornisca un buon messaggio e InnerException per il contesto
  • Preferisca i tipi integrati quando sono adatti

Tipo di eccezione personalizzato

Derivi da Exception, termini il nome con Exception e aggiunga i costruttori standard. Includa pochi dati utili.

using System;

// Custom, specific to our domain
public sealed class ConfigNotFoundException : Exception
{
  public string Key { get; private set; }

  public ConfigNotFoundException(string key)
    : base("Config key not found: " + key)
  {
    Key = key;
  }

  public ConfigNotFoundException(string key, Exception inner)
    : base("Config key not found: " + key, inner)
  {
    Key = key;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      throw new ConfigNotFoundException("ApiUrl");
    }
    catch (ConfigNotFoundException ex)
    {
      Console.WriteLine(ex.Message);
    }
  }
}

InnerException per il contesto

Incapsuli le eccezioni di livello inferiore in un'eccezione di dominio e imposti InnerException per conservare la causa principale.

using System;
using System.IO;

public sealed class ConfigNotFoundException : Exception
{
  public string Key { get; private set; }
  public ConfigNotFoundException(string key, Exception inner)
    : base("Config key not found: " + key, inner) { Key = key; }
}

public static class Config
{
  public static string Load(string path, string key)
  {
    try
    {
      string[] lines = File.ReadAllLines(path); // may throw
      for (int i = 0; i < lines.Length; i++)
      {
        int idx = lines[i].IndexOf("=");
        if (idx > 0 && lines[i].Substring(0, idx) == key)
          return lines[i].Substring(idx + 1);
      }
      throw new ConfigNotFoundException(key, null);
    }
    catch (IOException io)
    {
      // Wrap low-level error with domain meaning
      throw new ConfigNotFoundException(key, io);
    }
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try
    {
      Console.WriteLine(Config.Load("missing.cfg", "ApiUrl"));
    }
    catch (ConfigNotFoundException ex)
    {
      Console.WriteLine("Top: " + ex.Message);
      if (ex.InnerException != null)
        Console.WriteLine("Inner: " + ex.InnerException.GetType().Name);
    }
  }
}

Scegliere prima i tipi integrati

Utilizzi i tipi integrati per i problemi comuni: ArgumentNullException, ArgumentOutOfRangeException, FormatException, InvalidOperationException e così via.

using System;

public static class MathUtil
{
  public static int Divide(int a, int b)
  {
    if (b == 0) throw new DivideByZeroException();
    return a / b;
  }

  public static int ParsePositive(string text)
  {
    if (text == null) throw new ArgumentNullException("text");
    int value = int.Parse(text); // may throw FormatException
    if (value <= 0) throw new ArgumentOutOfRangeException("text", "must be > 0");
    return value;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    try { Console.WriteLine(MathUtil.ParsePositive("-1")); }
    catch (ArgumentOutOfRangeException ex) { Console.WriteLine("Range: " + ex.ParamName); }
  }
}

Eccezioni e controlli

Utilizzi le eccezioni per situazioni eccezionali. Per gli errori previsti, preferisca i controlli TryX o i codici di ritorno.

using System;

public static class Parser
{
  // BAD: using exceptions for expected cases
  public static int ParseOrThrow(string s)
  {
    return int.Parse(s); // will throw often for user input
  }

  // GOOD: guard-check pattern for expected failure
  public static bool TryParsePositive(string s, out int value)
  {
    value = 0;
    int tmp;
    if (!int.TryParse(s, out tmp)) return false;
    if (tmp <= 0) return false;
    value = tmp;
    return true;
  }
}

public class Program
{
  public static void Main(string[] args)
  {
    int v;
    if (Parser.TryParsePositive("12", out v))
      Console.WriteLine("OK " + v);
    else
      Console.WriteLine("Invalid");
  }
}

Checklist per la progettazione degli errori

Checklist:

  • Scelga un tipo integrato quando possibile.
  • Altrimenti, crei un piccolo CustomException con i costruttori standard.
  • Imposti InnerException per preservare la causa principale.
  • Utilizzi le eccezioni per i casi imprevisti; utilizzi TryX per gli errori previsti.

Progettazione delle eccezioni personalizzate

Verifica rapida: qual è una progettazione consigliata per un tipo di eccezione personalizzato in C#?

Riepilogo

Riepilogo: preferisca le eccezioni integrate; altrimenti definisca un piccolo tipo personalizzato con i costruttori standard e utilizzi InnerException per aggiungere contesto senza perdere la causa.

Domande Frequenti

La lezione «Eccezioni personalizzate; progettazione degli errori» è gratuita?

Sì — il testo completo di «Eccezioni personalizzate; progettazione degli errori» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 3 lezioni in totale.

Cosa imparerò in «Eccezioni personalizzate; progettazione degli errori»?

Create eccezioni personalizzate semplici, scegliete i tipi integrati corretti (ArgumentException, InvalidOperationException) e aggiungete contesto con InnerException. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 3.

Quanto tempo richiede la lezione «Eccezioni personalizzate; progettazione degli errori»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. try/catch/finally, throw new e rethrow
  2. Eccezioni personalizzate; progettazione degli errori
  3. IDisposable, istruzione using
← Torna a C# Academy