Sdílet prostřednictvím


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#)

Koncepty

Příručka programování C#