Używanie wyjątków (Przewodnik programowania w języku C#)
W języku C# błędów w programie w czasie wykonywania są propagowane przez program przy użyciu mechanizmu, nazywane wyjątki.Wyjątki są generowane przez kod, który napotka błąd i złowionych przez kod, który można poprawić błąd.Wyjątki, może zostać wygenerowany przez.NET Framework common language runtime (CLR) lub kodu w programie.Gdy wyjątek jest generowany, propaguje on górę stosu wywołań aż do catch znajduje się instrukcja wyjątku.Nieprzechwycony wyjątki są obsługiwane przez obsługi wyjątków rodzajowy, oferowanych przez system, który wyświetla okno dialogowe.
Wyjątki są reprezentowane przez klasy pochodzące od Exception.Ta klasa określa typ wyjątku i zawiera właściwości, które mają szczegółowe informacje o wyjątku.Zgłaszanie wyjątku polega na utworzeniu instancji klasy pochodzące z wyjątkiem, opcjonalnie Konfigurowanie właściwości wyjątku i następnie rzuca obiektu przy użyciu throw słowa kluczowego.Na przykład:
class CustomException : Exception
{
public CustomException(string message)
{
}
}
private static void TestThrow()
{
CustomException ex =
new CustomException("Custom exception in TestThrow()");
throw ex;
}
Po wyjątek, aparat plików wykonywalnych sprawdza bieżącej instrukcji, aby zobaczyć, czy jest w try bloku.Jeśli jest dowolny catch bloków związane z try bloku są sprawdzane w celu sprawdzenia, czy ich może przechwycić wyjątek.Catchbloki zazwyczaj określenie typów wyjątków; Jeśli typ catch bloku jest tego samego typu, jako wyjątek lub klasą bazową wyjątku, catch bloku może obsłużyć metody.Na przykład:
static void TestCatch()
{
try
{
TestThrow();
}
catch (CustomException ex)
{
System.Console.WriteLine(ex.ToString());
}
}
Jeśli instrukcja, która zgłasza wyjątek, nie jest w try bloku lub jeśli try bloku, który otacza go ma brak odpowiedniego catch blok, aparat plików wykonywalnych sprawdza, czy wywołujący metodę try instrukcji i catch bloków.Aparat plików wykonywalnych w dalszym ciągu górę stosu wywołującego, wyszukiwanie zgodnych z catch bloku.Po catch blok zostanie odnaleziony i wykonane, sterowanie jest przekazywane do następnej instrukcji po catch bloku.
A try instrukcji może zawierać więcej niż jedną catch bloku.Pierwszy catch jest wykonywana instrukcja, jaką może obsłużyć wyjątek; Następny catch sprawozdań, nawet jeśli są one zgodne, są ignorowane.W związku z tym, połowu bloki zawsze powinny być uporządkowane od najbardziej określonych (lub otrzymane przez większość) do najmniej szczegółowych.Na przykład:
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");
}
Przed catch wykonaniu bloku środowiska wykonawczego sprawdza finally bloków.Finallybloki włączyć programisty oczyścić niejednoznaczne stan, który może być po wykrojeniu przerwane try bloku, lub aby zwolnić wszelkich zewnętrznych zasobów (takich jak uchwyty grafiki, połączenia z bazą danych lub plik strumieni) bez konieczności oczekiwania na garbage collector w czasie wykonywania sfinalizować obiektów.Na przykład:
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");
}
}
Jeśli WriteByte() zwrócił wyjątek, kod w drugim try bloku, który próbuje ponownie otworzyć plik będzie się nie powieść, jeśli file.Close() nie jest wywoływana i pliku pozostaną zablokowane.Ponieważ finally bloki są wykonywane, nawet jeśli wyjątek, finally bloku w poprzednim przykładzie umożliwia dla pliku ma być zamknięty poprawnie i pomaga uniknąć błędu.
Jeśli nie zgodnych z catch bloku znajduje się w stos wywołań po wyjątek, występuje jedno z trzech zdarzeń:
Jeśli wyjątek jest w ramach destruktor, destruktor jest przerywana i destruktora podstawowej, jeśli takie są, jest nazywany.
Jeśli zawiera stos wywołań w konstruktorze statycznym lub inicjatorze pola statycznego TypeInitializationException jest generowany, z wyjątkiem oryginalnego, przypisane do InnerException właściwość nowych wyjątków.
Jeśli zostanie osiągnięty początek wątku, wątek zostanie zakończony.
Zobacz też
Informacje
Wyjątki i obsługa wyjątków (Przewodnik programowania w języku C#)