Udostępnij za pośrednictwem


(C# Programming Guide) obsługi wyjątków

A spróbować bloku jest używane przez programistów języka C# do kodu partycji, które mogą być dotknięte wyjątek.Związane połowu bloków są używane do obsługi wyjątków wynikowy.A na koniec zawiera kod, który jest wykonywany bez względu na to, czy nie występuje wyjątek try blok, takie jak zwolnienie zasobów, które są przydzielane w try bloku.A try bloku wymaga jednego lub więcej skojarzonych catch bloków, lub finally blok, lub obu.

W następujących przykładach pokazano try-catch instrukcji, try-finally instrukcji i try-catch-finally instrukcji.

try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here.
    // Only catch exceptions that you know how to handle.
    // Never catch base class System.Exception without
    // rethrowing it at the end of the catch block.
}
try
{
    // Code to try goes here.
}
finally
{
    // Code to execute after the try block goes here.
}
try
{
    // Code to try goes here.
}
catch (SomeSpecificException ex)
{
    // Code to handle the exception goes here.
}
finally
{
    // Code to execute after the try (and possibly catch) blocks 
    // goes here.
}

A try blok bez catch lub finally bloku powoduje błąd kompilatora.

Bloki catch

A catch bloku można określić typ wyjątku do połowu.Specyfikacja typu nazywa się Filtr wyjątków.Typ wyjątku powinien pochodzić z Exception.Ogólnie rzecz biorąc, nie należy określać Exception jak filtr wyjątek, chyba że albo wiesz, jak obsługiwać wszystkie wyjątki, które może zostać wygenerowany w try bloku, czy zostały uwzględnione rzut instrukcja pod koniec swojej catch bloku.

Wiele catch bloków, z wyjątkiem różnych filtrów można połączonych ze sobą.catch Bloków są obliczane od góry do dołu w kodzie, ale tylko jeden catch bloku jest wykonywane dla każdego wyjątku, który jest generowany.Pierwszy catch bloku, który określa dokładny typ lub klasa podstawowa wyrzucony wyjątek jest wykonywany.Jeśli nie catch bloku określa pasujący filtr wyjątków, catch blok, który nie ma filtru jest zaznaczone, jeśli jest obecny w instrukcji.Ważne jest, aby umieścić catch bloki z najbardziej wyjątek (oznacza to, że najbardziej pochodnych) poszczególnych typów po raz pierwszy.

Należy przechwytywać wyjątków, gdy są spełnione następujące warunki:

  • Masz dobre zrozumienie, dlaczego może wyjątek i można zaimplementować określone odzyskiwania, takich jak monitowanie użytkownika o wprowadzenie nowej nazwy pliku podczas połowu FileNotFoundException obiektu.

  • Można tworzyć i wyjątku nowe, bardziej szczegółowe.

    int GetInt(int[] array, int index)
    {
        try
        {
            return array[index];
        }
        catch(System.IndexOutOfRangeException e)
        {
            throw new System.ArgumentOutOfRangeException(
                "Parameter index is out of range.");
        }
    }
    
  • Chcesz częściowo obsłużyć wyjątek przed przekazaniem go dodatkowych czynności.W poniższym przykładzie catch blok jest używany do dodania wpisu do dziennika błędów przed ponowne wrzucenie wyjątku.

    try
    {
        // Try to access a resource.
    }
    catch (System.UnauthorizedAccessException e)
    {
        // Call a custom error logging procedure.
        LogError(e);
        // Re-throw the error.
        throw;     
    }
    

Wreszcie bloki

A finally bloku umożliwia czyszczenie akcje, które są wykonywane w try bloku.Jeśli jest obecny, finally bloku wykonuje ostatni, po try bloku i wszystkie dopasowane catch bloku.A finally blok zawsze działa, niezależnie od tego czy jest wyjątek lub catch znajduje się blok pasujące typ wyjątku.

finally Bloku można zwolnić zasoby, takie jak plik strumieni, połączenia z bazą danych i obsługuje grafiki, bez oczekiwania na garbage collector w czasie wykonywania do sfinalizowania obiektów.Aby uzyskać więcej informacji, zobacz za pomocą instrukcji (C# odniesienia).

W poniższym przykładzie finally blok jest używany, aby zamknąć plik, który jest otwarty w try bloku.Należy zauważyć, że sprawdzany jest stan dojścia do pliku, zanim plik zostanie zamknięty.Jeśli try bloku nie można otworzyć pliku, dojście do pliku wciąż ma wartość null i finally bloku nie próbuje go zamknąć.Alternatywnie Jeśli plik jest otwierany pomyślnie w try blok, finally bloku Zamyka otwarty plik.

System.IO.FileStream file = null;
System.IO.FileInfo fileinfo = new System.IO.FileInfo("C:\\file.txt");
try
{
    file = fileinfo.OpenWrite();
    file.WriteByte(0xF);
}
finally
{
    // Check for null because OpenWrite might have failed.
    if (file != null)
    {
        file.Close();
    }
}

Specyfikacja języka C#

Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka to najlepsze źródło informacji dotyczących składni i zastosowania języka C#.

Zobacz też

Informacje

Wyjątki i obsługi wyjątków (Podręcznik programowania C#)

try-catch (C# odniesienia)

try-finally (C# odniesienia)

try-catch-finally (C# odniesienia)

za pomocą instrukcji (C# odniesienia)

Koncepcje

Podręcznik programowania C#

Inne zasoby

C# odniesienia