Brugerdefinerede undtagelser og fejldesign
Opret små brugerdefinerede undtagelser, vælg de rigtige indbyggede typer (ArgumentException, InvalidOperationException), og tilføj kontekst med InnerException.
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
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.
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
- try/catch/finally, throw new kontra rethrow
- Brugerdefinerede undtagelser og fejldesign
- IDisposable og using-sætningen