Použití výjimky (Příručka programování C#)
Chyby při běhu programu jsou v jazyce C# šířeny prostřednictvím programu pomocí mechanismu se nazývá výjimky.Výjimky jsou vyvolána kód, který nalezne chybu a ulovená kód, který můžete chybu opravit.Výjimky může být vyvolána.NET Framework společného jazykového modulu runtime (CLR) nebo kódu v programu.Jakmile je vyvolána výjimka, rozšíří až do zásobníku volání catch prohlášení výjimky je nalezen.Obecná výjimka Handler poskytované systémem, který zobrazí dialogové okno zpracování nezachycené výjimky.
Výjimky jsou představovány třídy odvozené z Exception.Tato třída určuje typ výjimky a obsahuje vlastnosti, které obsahují podrobnosti o výjimce.Došlo k výjimce zahrnuje vytvoření instance třídy odvozené výjimku, volitelně konfigurace vlastností výjimky a pak vyvolání pomocí objektu throw klíčové slovo.Příklad:
class CustomException : Exception
{
public CustomException(string message)
{
}
}
private static void TestThrow()
{
CustomException ex =
new CustomException("Custom exception in TestThrow()");
throw ex;
}
Po je vyvolána výjimka, modul runtime zkontroluje aktuální prohlášení, zda je v rámci try bloku.Pokud je některý catch bloky spojené s try bloku jsou kontrolovány a zjistěte, zda mohou zachytit výjimku.Catchbloky obvykle určují typy výjimek; Pokud typ catch blok je stejného typu jako výjimku nebo základní třída výjimek, catch bloku lze zpracovat metodou.Příklad:
static void TestCatch()
{
try
{
TestThrow();
}
catch (CustomException ex)
{
System.Console.WriteLine(ex.ToString());
}
}
Pokud není příkaz, který výjimku v rámci try bloku nebo pokud try blok, který uzavře ho má žádné odpovídající catch bloku runtime zkontroluje volající metodu try prohlášení a catch bloky.Modul runtime pokračuje až volání zásobníku, vyhledávání kompatibilní catch bloku.Po catch bloku je nalezen a provedeny, řízení je předáno další příkaz, který po catch bloku.
A try prohlášení může obsahovat více než jednu catch bloku.První catch provedení příkazu, který lze zpracovat výjimku; všechny následující catch příkazy, i když jsou kompatibilní, jsou ignorovány.Proto zachytit bloky by mělo být objednáno vždy z nejvíce specifické (nebo odvozené většinu) nejméně přesné.Příklad:
static void TestCatch2()
{
System.IO.StreamWriter sw = null;
try
{
sw = new System.IO.StreamWriter(@"C:\test\test.txt");
sw.WriteLine("Hello");
}
catch (System.IO.FileNotFoundException ex)
{
// Put the more specific exception first.
System.Console.WriteLine(ex.ToString());
}
catch (System.IO.IOException ex)
{
// Put the less specific exception last.
System.Console.WriteLine(ex.ToString());
}
finally
{
sw.Close();
}
System.Console.WriteLine("Done");
}
Před catch pro vykonání bloku zkontroluje runtime finally bloky.Finallybloky povolit programátor vyčistit dvojznačný státu, který nelze vlevo z přerušena try bloku, nebo uvolnit všechny externí prostředky (například grafiky zpracovává připojení databáze nebo soubor proudy) bez čekání na uvolnění paměti kolekcí v modulu runtime dokončit objekty.Příklad:
static void TestFinally()
{
System.IO.FileStream file = null;
//Change the path to something that works on your machine.
System.IO.FileInfo fileInfo = new System.IO.FileInfo(@"C:\file.txt");
try
{
file = fileInfo.OpenWrite();
file.WriteByte(0xF);
}
finally
{
// Closing the file allows you to reopen it immediately - otherwise IOException is thrown.
if (file != null)
{
file.Close();
}
}
try
{
file = fileInfo.OpenWrite();
System.Console.WriteLine("OpenWrite() succeeded");
}
catch (System.IO.IOException)
{
System.Console.WriteLine("OpenWrite() failed");
}
}
Pokud WriteByte() došlo k výjimce kód ve druhé try blok, který se pokouší znovu otevřete soubor selže, pokud file.Close() nebyla volána a soubor zůstane uzamčen.Protože finally bloky jsou spouštěny i v případě, že je vyvolána výjimka, finally bloku v předchozím příkladu umožňuje soubor správně uzavřena a pomáhá vyhnout se chybě.
Pokud není kompatibilní s catch bloku se nachází na zásobník volání po je vyvolána výjimka, dojde k jedné tři věci:
Je-li výjimka v destruktor, se objekt přerušena a základní destructor, se nazývá.
Zásobník volání obsahuje statického konstruktoru nebo inicializátoru pole statické TypeInitializationException je vyvolána s výjimkou původní přiřazen InnerException vlastnost nové výjimky.
Pokud spuštění podprocesu podprocesu je ukončeno.
Viz také
Referenční dokumentace
Výjimky a zpracování výjimek (Příručka programování C#)