Obsługa i zgłaszanie wyjątków w programie .NETHandling and throwing exceptions in .NET

Aplikacje muszą być w stanie obsługiwać błędy występujące podczas wykonywania w spójny sposób.Applications must be able to handle errors that occur during execution in a consistent manner. Platforma .NET udostępnia model do powiadamiania aplikacji o błędach w jednolity sposób: operacje platformy .NET wskazują na awarię przez wyrzucanie wyjątków..NET provides a model for notifying applications of errors in a uniform way: .NET operations indicate failure by throwing exceptions.

WyjątkiExceptions

Wyjątek jest dowolnym warunkiem błędu lub nieoczekiwanym zachowaniem napotkanym przez program wykonujący.An exception is any error condition or unexpected behavior that is encountered by an executing program. Wyjątki mogą być zgłaszane z powodu błędu w kodzie lub kodu, który jest wywoływany (na przykład biblioteki udostępnionej), niedostępnych zasobów systemu operacyjnego, nieoczekiwanych warunków napotkanych przez środowisko uruchomieniowe (takich jak kod, którego nie można zweryfikować) itd.Exceptions can be thrown because of a fault in your code or in code that you call (such as a shared library), unavailable operating system resources, unexpected conditions that the runtime encounters (such as code that can't be verified), and so on. Aplikacja może wykonać odzyskiwanie z niektórych z tych warunków, ale nie od innych.Your application can recover from some of these conditions, but not from others. Chociaż można wykonać odzyskiwanie z większości wyjątków aplikacji, nie można odzyskać sprawności z większości wyjątków czasu wykonywania.Although you can recover from most application exceptions, you can't recover from most runtime exceptions.

W programie .NET wyjątek jest obiektem, który dziedziczy z System.Exception klasy.In .NET, an exception is an object that inherits from the System.Exception class. Wyjątek jest generowany z obszaru kodu, w którym wystąpił problem.An exception is thrown from an area of code where a problem has occurred. Wyjątek jest przenoszona do momentu, aż aplikacja obsłuży go lub zakończy działanie programu.The exception is passed up the stack until the application handles it or the program terminates.

Wyjątki a tradycyjne metody obsługi błędówExceptions vs. traditional error-handling methods

Tradycyjnie model obsługi błędów języka opiera się na unikatowym sposobie wykrywania błędów i lokalizowania programów obsługi albo w mechanizmie obsługi błędów dostarczonym przez system operacyjny.Traditionally, a language's error-handling model relied on either the language's unique way of detecting errors and locating handlers for them, or on the error-handling mechanism provided by the operating system. Sposób, w jaki program .NET implementuje obsługę wyjątków, zapewnia następujące korzyści:The way .NET implements exception handling provides the following advantages:

  • Przerzucanie i obsługa wyjątków działa tak samo dla języków programowania .NET.Exception throwing and handling works the same for .NET programming languages.

  • Nie wymaga żadnej określonej składni języka do obsługi wyjątków, ale umożliwia każdemu językowi zdefiniowanie własnej składni.Doesn't require any particular language syntax for handling exceptions, but allows each language to define its own syntax.

  • Wyjątki mogą być zgłaszane między procesami, a nawet granicami maszyn.Exceptions can be thrown across process and even machine boundaries.

  • Kod obsługi wyjątków można dodać do aplikacji w celu zwiększenia niezawodności programu.Exception-handling code can be added to an application to increase program reliability.

Wyjątki oferują zalety w porównaniu z innymi metodami powiadamiania o błędach, takich jak kody powrotne.Exceptions offer advantages over other methods of error notification, such as return codes. Niepowodzenia nie są wyrzucane, ponieważ jeśli wystąpi wyjątek, a jego nie obsłużysz, środowisko uruchomieniowe zakończy działanie aplikacji.Failures don't go unnoticed because if an exception is thrown and you don't handle it, the runtime terminates your application. Nieprawidłowe wartości nie są nadal propagowane przez system w wyniku kodu, który nie może sprawdzić kodu powrotu błędu.Invalid values don't continue to propagate through the system as a result of code that fails to check for a failure return code.

Typowe wyjątkiCommon exceptions

W poniższej tabeli wymieniono niektóre typowe wyjątki z przykładami, które mogą je spowodować.The following table lists some common exceptions with examples of what can cause them.

Typ wyjątkuException type OpisDescription PrzykładExample
Exception Klasa bazowa dla wszystkich wyjątków.Base class for all exceptions. Brak (Użyj klasy pochodnej tego wyjątku).None (use a derived class of this exception).
IndexOutOfRangeException Zgłoszone przez środowisko uruchomieniowe tylko wtedy, gdy tablica jest indeksowana nieprawidłowo.Thrown by the runtime only when an array is indexed improperly. Indeksowanie tablicy poza prawidłowym zakresem:Indexing an array outside its valid range:
arr[arr.Length+1]
NullReferenceException Zgłoszone przez środowisko uruchomieniowe tylko wtedy, gdy istnieje odwołanie do obiektu o wartości null.Thrown by the runtime only when a null object is referenced. object o = null;
o.ToString();
InvalidOperationException Zgłoszone przez metody w nieprawidłowym stanie.Thrown by methods when in an invalid state. Wywoływanie Enumerator.MoveNext() po usunięciu elementu z kolekcji źródłowej.Calling Enumerator.MoveNext() after removing an item from the underlying collection.
ArgumentException Klasa bazowa dla wszystkich wyjątków argumentów.Base class for all argument exceptions. Brak (Użyj klasy pochodnej tego wyjątku).None (use a derived class of this exception).
ArgumentNullException Zgłoszone przez metody, które nie zezwalają argumentu na wartość null.Thrown by methods that do not allow an argument to be null. String s = null;
"Calculate".IndexOf(s);
ArgumentOutOfRangeException Zgłoszone przez metody, które weryfikują, że argumenty znajdują się w danym zakresie.Thrown by methods that verify that arguments are in a given range. String s = "string";
s.Substring(s.Length+1);

Zobacz takżeSee also