Tworzenie i zgłaszanie wyjątków (Przewodnik programowania w języku C#)
Wyjątki są używane do wskazania, że wystąpił błąd podczas uruchamiania programu.Tworzone są obiekty wyjątek, które opisują błąd i następnie thrown z throw słowa kluczowego.Aparat plików wykonywalnych wyszukuje następnie najbardziej zgodne procedury obsługi wyjątków.
Programiści powinien zgłosić wyjątki, gdy jeden lub więcej z następujących warunków jest spełniony:
Metoda nie może ukończyć jego określonych funkcji.
Na przykład, jeśli parametr do metody ma nieprawidłową wartość:
static void CopyObject(SampleClass original) { if (original == null) { throw new System.ArgumentException("Parameter cannot be null", "original"); } }
Wykonane wywołanie nieodpowiednie do obiektu, na podstawie stanu obiektu.
Przykładem może być próby zapisu do pliku tylko do odczytu.W przypadkach, gdy obiekt stanie nie zezwala na operację throw wystąpienie InvalidOperationException lub obiektu na podstawie wyprowadzenie tej klasy.Jest to przykład metoda, która wyrzuca InvalidOperationException obiekt:
class ProgramLog { System.IO.FileStream logFile = null; void OpenLog(System.IO.FileInfo fileName, System.IO.FileMode mode) {} void WriteLog() { if (!this.logFile.CanWrite) { throw new System.InvalidOperationException("Logfile cannot be read-only"); } // Else write data to the log and return. } }
Gdy argument do metody powoduje wyjątek.
W tym przypadku złowionych pierwotny wyjątek i ArgumentException można utworzyć wystąpienia.Pierwotny wyjątek powinien zostać przekazany do konstruktora ArgumentException jako InnerException parametru:
static int GetValueFromArray(int[] array, int index) { try { return array[index]; } catch (System.IndexOutOfRangeException ex) { System.ArgumentException argEx = new System.ArgumentException("Index is out of range", "index", ex); throw argEx; } }
Wyjątki zawiera właściwość o nazwie StackTrace.Ciąg ten zawiera nazwę metody na bieżący stos wywołań, wraz z numerem nazwę i wiersz pliku gdzie wystąpił wyjątek dla każdej metody.A StackTrace obiekt jest tworzony automatycznie przez common language runtime (CLR) od punktu throw instrukcji, tak aby musi zostać wygenerowany wyjątki od punktu, gdzie powinno rozpocząć się ślad stosu.
Wszystkie wyjątki zawiera właściwość o nazwie Message.Ten ciąg należy ustawić wyjaśniający przyczynę wyjątku.Należy zauważyć, że informacje, które są wrażliwe na zabezpieczenia nie należy wprowadzić tekst wiadomości.Oprócz Message, ArgumentException zawiera właściwość o nazwie ParamName , powinna być równa nazwę argumentu, który spowodował wyjątek zostać wygenerowany.W odniesieniu do ustawiająca właściwość ParamName powinien być ustawiony na value.
Metody publiczne i chronionych członków powinien zgłosić wyjątki, w każdym przypadku, gdy one nie może ukończyć ich zamierzonych funkcji.Klasa wyjątków, który jest generowany, powinny być najbardziej konkretny wyjątek dostępne, który pasuje do warunków błędów.Wyjątki te powinny być udokumentowane jako część funkcji klasa i klasy pochodne lub aktualizacje do oryginalnej klasy powinny zachowywać takie samo zachowanie zgodności z poprzednimi wersjami.
Rzeczy, aby uniknąć przy wyrzucaniu wyjątków
Poniższa lista zawiera wskazówki, aby uniknąć przy wyrzucaniu wyjątków:
Wyjątki nie powinny umożliwiające zmianę przepływu programu jako część zwykłych wykonanie.Wyjątki stosuje się tylko do raportu i obsługi błędów.
Wyjątki nie powinny być zwrócone jako wartość zwracana lub parametr zamiast są generowane.
Nie throw Exception, SystemException, NullReferenceException, lub IndexOutOfRangeException celowo z kodu źródłowego.
Nie należy tworzyć wyjątki, które może zostać wygenerowany w trybie debugowania, ale nie zwalnia tryb.Aby zidentyfikować błędy czasu wykonania w fazie rozwoju, należy użyć debugowania potwierdzenia.
Definiowanie klas wyjątków
Programy można throw klasy wstępnie zdefiniowany wyjątek System nazw (z wyjątkiem przypadków, gdy wcześniej zaznaczono), lub utworzyć własne klas wyjątków wynikających z Exception.Klas pochodnych należy zdefiniować co najmniej czterech konstruktory: Konstruktor domyślny, taki, który ustawia właściwości wiadomości i taką, która ustawia oba Message i InnerException właściwości.Czwarty konstruktora jest używana do serializacji wyjątek.Nowych klas wyjątków powinien mieć możliwość serializowania.Na przykład:
[Serializable()]
public class InvalidDepartmentException : System.Exception
{
public InvalidDepartmentException() : base() { }
public InvalidDepartmentException(string message) : base(message) { }
public InvalidDepartmentException(string message, System.Exception inner) : base(message, inner) { }
// A constructor is needed for serialization when an
// exception propagates from a remoting server to the client.
protected InvalidDepartmentException(System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context) { }
}
Nowe właściwości powinny być dodane do klasy wyjątek tylko, gdy dane, które mają dostarczać jest przydatne do rozwiązywania wyjątek.Jeżeli nowe właściwości są dodawane do klasy pochodne z wyjątkiem ToString() powinna być zastąpiona zwrotu dodano informacje.
Specyfikacja języka C#
Aby uzyskać więcej informacji, zobacz Specyfikacja języka C#. Specyfikacja języka jest ostatecznym źródłem informacji o składni i użyciu języka C#.
Zobacz też
Informacje
Wyjątki i obsługa wyjątków (Przewodnik programowania w języku C#)
Obsługa wyjątków (Przewodnik programowania w języku C#)