C# Academy · Lektion

Brugerdefinerede undtagelser og fejldesign

Opret små brugerdefinerede undtagelser, vælg de rigtige indbyggede typer (ArgumentException, InvalidOperationException), og tilføj kontekst med InnerException.

Lektion 2 af 38 trin

Brugerdefinerede undtagelser og fejldesign er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 2 af 3. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 3 lektioner i alt.

Formål og mål

Formål: Gør fejl tydelige og mulige at fange.

  • Brug en specifik type til en specifik fejl
  • En god meddelelse og InnerException giver kontekst
  • Foretræk indbyggede typer, når de passer

Brugerdefineret undtagelsestype

Nedarv fra Exception, afslut navnet med Exception, og tilføj standardkonstruktørerne. Medtag små mængder nyttige data.

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 til kontekst

Pak undtagelser fra lavere niveauer ind i en domæneundtagelse, og angiv InnerException for at bevare den egentlige årsag.

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

Vælg indbyggede typer først

Brug indbyggede typer til almindelige problemer: ArgumentNullException, ArgumentOutOfRangeException, FormatException, InvalidOperationException osv.

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

Undtagelser kontra kontroller

Brug undtagelser i ekstraordinære situationer. Foretræk ved forventede fejl TryX-kontroller eller returværdier.

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

Tjekliste til fejldesign

Tjekliste:

  • Vælg en indbygget type, når det er muligt.
  • Opret ellers en lille CustomException med standardkonstruktører.
  • Vedhæft InnerException for at bevare den egentlige årsag.
  • Brug undtagelser i uventede tilfælde; brug TryX ved forventede fejl.

Design af brugerdefinerede undtagelser

Hurtigt tjek: Hvilket design anbefales til en brugerdefineret undtagelsestype i C#?

Opsummering

Opsummering: Foretræk indbyggede undtagelser. Ellers skal du definere en lille brugerdefineret type med standardkonstruktører og bruge InnerException til at tilføje kontekst uden at miste årsagen.

Gratis at komme i gang

Lær C# med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
93
Lektioner
346

Ofte stillede spørgsmål

Er lektionen “Brugerdefinerede undtagelser og fejldesign” gratis?

Ja — hele teksten til “Brugerdefinerede undtagelser og fejldesign” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 3 lektioner i alt.

Hvad lærer jeg i “Brugerdefinerede undtagelser og fejldesign”?

Opret små brugerdefinerede undtagelser, vælg de rigtige indbyggede typer (ArgumentException, InvalidOperationException), og tilføj kontekst med InnerException. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på C# Academy?

Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 2 af 3.

Hvor lang tid tager lektionen “Brugerdefinerede undtagelser og fejldesign”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne C# Academy-lektion?

Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. try/catch/finally, throw new kontra rethrow
  2. Brugerdefinerede undtagelser og fejldesign
  3. IDisposable og using-sætningen
← Tilbage til C# Academy