Exportieren (0) Drucken
Alle erweitern
Dieser Artikel wurde maschinell übersetzt. Bewegen Sie den Mauszeiger über die Sätze im Artikel, um den Originaltext anzuzeigen. Weitere Informationen
Übersetzung
Original

Exception-Klasse

Stellt Fehler dar, die beim Ausführen einer Anwendung auftreten.

Namespace:  System
Assembly:  mscorlib (in mscorlib.dll)

[SerializableAttribute]
[ComVisibleAttribute(true)]
[ClassInterfaceAttribute(ClassInterfaceType.None)]
public class Exception : ISerializable, _Exception

Der Exception-Typ macht die folgenden Member verfügbar.

  NameBeschreibung
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsException()Initialisiert eine neue Instanz der Exception-Klasse.
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsException(String)Initialisiert eine neue Instanz der Exception-Klasse mit einer angegebenen Fehlermeldung.
Geschützte MethodeException(SerializationInfo, StreamingContext)Initialisiert eine neue Instanz der Exception-Klasse mit serialisierten Daten.
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsException(String, Exception)Initialisiert eine neue Instanz der Exception-Klasse mit einer angegebenen Fehlermeldung und einem Verweis auf die innere Ausnahme, die diese Ausnahme verursacht hat.
Zum Seitenanfang

  NameBeschreibung
Öffentliche EigenschaftUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsDataRuft eine Auflistung von Schlüssel-Wert-Paaren ab, die zusätzliche benutzerdefinierte Informationen zu der Ausnahme bereitstellen.
Öffentliche EigenschaftUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsHelpLinkRuft einen Link zur Hilfedatei ab, die dieser Ausnahme zugeordnet ist, oder legt einen Link fest.
Öffentliche EigenschaftUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsHResultRuft HRESULT ab oder legt HRESULT fest. Dies ist ein codierter Wert, der einer bestimmten Ausnahme zugeordnet ist.
Öffentliche EigenschaftUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsInnerExceptionRuft die Exception-Instanz ab, die die aktuelle Ausnahme verursachte.
Öffentliche EigenschaftUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsMessageRuft eine Meldung ab, die die aktuelle Ausnahme beschreibt.
Öffentliche EigenschaftUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsSourceGibt den Namen der Anwendung oder des Objekts zurück, das den Fehler verursacht hat, oder legt diesen fest.
Öffentliche EigenschaftUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsStackTraceRuft eine Zeichenfolgendarstellung der unmittelbaren Frames in der Aufrufliste ab.
Öffentliche EigenschaftTargetSiteRuft die Methode ab, die die aktuelle Ausnahme auslöst.
Zum Seitenanfang

  NameBeschreibung
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsEquals(Object)Bestimmt, ob das angegebene Objekt mit dem aktuellen Objekt identisch ist. (Von Object geerbt.)
Geschützte MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsFinalize Gibt einem Objekt Gelegenheit, Ressourcen freizugeben und andere Bereinigungen durchzuführen, bevor es von der Garbage Collection freigegeben wird. (Von Object geerbt.)
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsGetBaseExceptionGibt beim Überschreiben in einer abgeleiteten Klasse eine Exception zurück, die die ursprüngliche Ursache für eine oder mehrere nachfolgende Ausnahmen ist.
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsGetHashCodeFungiert als die Standardhashfunktion. (Von Object geerbt.)
Öffentliche MethodeGetObjectDataLegt beim Überschreiben in einer abgeleiteten Klasse die SerializationInfo mit Informationen über die Ausnahme fest.
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsGetTypeRuft den Laufzeittyp der aktuellen Instanz ab.

In XNA Framework 3.0 wird dieser Member von Object geerbt.GetType().


In Portable Klassenbibliothek Portable Klassenbibliothek wird dieser Member von Object geerbt.GetType().


In .NET für Windows Store-Apps Windows 8 wird dieser Member von Object geerbt.GetType().
Geschützte MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsMemberwiseCloneErstellt eine flache Kopie des aktuellen Object. (Von Object geerbt.)
Öffentliche MethodeUnterstützt von XNA FrameworkUnterstützt von Portable KlassenbibliothekUnterstützt in .NET für Windows Store-AppsToStringErstellt eine Zeichenfolgenentsprechung der aktuellen Ausnahme und gibt diese zurück. (Überschreibt Object.ToString().)
Zum Seitenanfang

  NameBeschreibung
Geschütztes EreignisSerializeObjectStateTritt auf, wenn eine Ausnahme serialisiert wird, um ein Ausnahmezustandsobjekt zu erstellen, das serialisierte Daten für die Ausnahme enthält.
Zum Seitenanfang

Diese Klasse ist die Basisklasse für alle Ausnahmen. Wenn ein Fehler auftritt, entweder, das System oder die momentan ausgeführte Anwendung meldet sie, indem sie eine Ausnahme auslösen, die Informationen zum Fehler enthält. Nachdem eine Ausnahme ausgelöst wird, wird sie der Anwendung oder dem Standardausnahmehandler behandelt.

In diesem Abschnitt

Fehler und Ausnahmen
Try/catch-Blöcke
Ausnahmetypfunktionen
Ausnahmeklasseneigenschaften
Überlegungen zur Leistung
Auswählen von Standardausnahmen
Implementieren von benutzerdefinierten Ausnahmen

Fehler und Ausnahmen

Laufzeitfehler können aus mehreren Gründen auftreten. Allerdings sollten nicht alle Fehler als Ausnahmen im Code behandelt werden. Im Folgenden einige Kategorien zur Laufzeit Fehler, die auftreten können, und die entsprechenden Methoden auf diese reagieren.

  • Verwendungsfehler. Ein Verwendungsfehler stellt einen Fehler in der Programmlogik dar, die eine Ausnahme führen kann. Allerdings sollte der Fehler behandelt werden nicht über Ausnahmebehandlung jedoch, indem den fehlerhaften Code ändert. Zum Beispiel führt die Überschreibung der Object.Equals(Object)-Methode im folgenden Beispiel an, dass das Argument obj immer nicht NULL sein muss.

    
    using System;
    
    public class Person
    {
       private string _name;
    
       public string Name 
       {
          get { return _name; } 
          set { _name = value; }
       }
    
       public override int GetHashCode()
       {
          return this.Name.GetHashCode();  
       }  
    
       public override bool Equals(object obj)
       {
          // This implementation contains an error in program logic:
          // It assumes that the obj argument is not null.
          Person p = (Person) obj;
          return this.Name.Equals(p.Name);
       }
    }
    
    public class Example
    {
       public static void Main()
       {
          Person p1 = new Person();
          p1.Name = "John";
          Person p2 = null; 
    
          // The following throws a NullReferenceException.
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2));   
       }
    }
    
    
    

    Die NullReferenceException Ausnahme, die sich ergibt, wenn objnull ist, kann entfernt werden, von den Quellcode z Test für NULL explizit ändern, bevor die Object.Equals aufruft Überschreibung und anschließend neu kompiliert. Das folgende Beispiel enthält den korrigierten Quellcode, der ein Argument null behandelt.

    
    using System;
    
    public class Person
    {
       private string _name;
    
       public string Name 
       {
          get { return _name; } 
          set { _name = value; }
       }
    
       public override int GetHashCode()
       {
          return this.Name.GetHashCode();  
       }  
    
       public override bool Equals(object obj)
       {
           // This implementation handles a null obj argument.
           Person p = obj as Person; 
           if (p == null) 
              return false;
           else
              return this.Name.Equals(p.Name);
       }
    }
    
    public class Example
    {
       public static void Main()
       {
          Person p1 = new Person();
          p1.Name = "John";
          Person p2 = null; 
    
          Console.WriteLine("p1 = p2: {0}", p1.Equals(p2));   
       }
    }
    // The example displays the following output:
    //        p1 = p2: False
    
    
    

    Anstatt, Ausnahmebehandlung für Verwendungsfehler verwendet, können Sie die Debug.Assert-Methode verwenden, um Verwendungsfehler in Debugbuilds zu identifizieren, und die Methode Trace.Assert, mit der Verwendungsfehlern in beiden zu identifizieren Debug- und Releasebuilds. Weitere Informationen finden Sie unter Assertionen in verwaltetem Code.

  • Programmfehler. Ein Programmfehler ist ein Laufzeitfehler, die sich nicht notwendigerweise vermieden werden kann, indem FehlerFREE-Code schreibt.

    In einigen Fällen stellt ein Programmausfälle möglicherweise ein oder erwarteten Routinefehlerzustand. In diesem Fall sollten Sie die Ausnahmebehandlung zu vermeiden, verwenden, um den Programmfehler darzustellen und den Vorgang stattdessen zu wiederholen. Wenn der Benutzer erwartet wird, Datum in einem bestimmten Format einzugeben, können Sie die Datumszeichenfolge analysieren, indem Sie die DateTime.TryParseExact methode aufrufen, die einen Boolean-Wert zurück, der angibt, ob der Analysevorgang erfolgreich, anstatt, die Methode DateTime.ParseExact verwenden, die eine FormatException Ausnahme auslöst, wenn die Datumszeichenfolge nicht in einen DateTime-Wert konvertiert werden kann. Auch wenn ein Benutzer versucht, eine Datei zu öffnen, die nicht vorhanden ist, können Sie zuerst die File.Exists-Methode, überprüfen, ob die Datei, und wenn sie dies nicht vorhanden ist, den Benutzer aufzufordern, ob er oder sie erstellen möchten.

    In anderen Fällen stellt ein Programmausfälle einen unerwarteten Fehlerzustand, der in Code behandelt werden kann. Beispielsweise wenn Sie überprüft haben, um sicherzustellen, dass eine Datei vorhanden ist, wird er möglicherweise gelöscht, bevor Sie ihn öffnen können, oder er ist beschädigt werden. In diesem Fall löst das versucht werden, die Datei, indem ein StreamReader-Objekt instanziiert oder die Methode Open, zu öffnen aufruft eine FileNotFoundException Ausnahme aus. In diesen Fällen sollten Sie die Ausnahmebehandlung verwenden, um sich von dem Fehler zu beheben.

  • Systemfehler. Ein Laufzeitfehler ein Systemfehler ist, der nicht in übersichtlicher Weise programmgesteuert behandelt werden kann. Beispielsweise kann eine Methode eine OutOfMemoryException Ausnahme auslösen, wenn die Common Language Runtime nicht möglich ist, zusätzlichem Arbeitsspeicher zuordnen. Systemfehler Normalerweise werden nicht behandelt, indem Ausnahmebehandlung. Stattdessen können Sie in der Lage, einem Ereignis wie AppDomain.UnhandledException verwenden und die Environment.FailFast-Methode aufrufen, um Ausnahmeinformationen zu protokollieren und dem Benutzer den Fehler zu melden, bevor die Anwendung beendet wird.

Try/catch-Blöcke

Die Common Language Runtime stellt ein Modell für, dem die Darstellung von Ausnahmen als Objekte ist, und die Trennung des Programmcodes und des Ausnahmebehandlungscodes in try Blöcke und Blöcke in catch bereit. Es kann mehrere catch-Blöcke geben, von denen jeder zur Behandlung eines speziellen Ausnahmetyps bestimmt ist oder von denen ein Block zur Behandlung von genauer definierten Ausnahmen bestimmt ist.

Wenn eine Anwendung Ausnahmen behandelt, die bei der Ausführung eines Blocks im Anwendungscode auftreten, muss der Code innerhalb einer try-Anweisung erfolgen und try wird als Block bezeichnet. Anwendungscode, der die Ausnahmen behandelt, die von einem Block try ausgelöst werden, ist in einer catch-Anweisung eingefügt und catch wird als Block bezeichnet. Einem try-Block sind 0 oder mehr catch-Blöcke zugeordnet. Jeder catch-Block enthält einen Typfilter, der die Typen der von ihm behandelten Ausnahmen festlegt.

Wenn in einem try-Block eine Ausnahme ausgelöst wird, durchsucht das System die zugeordneten catch-Blöcke in der Reihenfolge, in der sie im Anwendungscode auftreten, bis ein catch-Block gefunden wird, der die Ausnahme behandelt. Ein catch-Block behandelt Ausnahmen vom Typ T, wenn der Typfilter des catch-Blocks T oder einen Typ angibt, von dem T abgeleitet ist. Wenn der erste catch-Block gefunden wird, der die Ausnahme behandelt, beendet das System die Suche. Aus diesem Grunde muss ein catch-Block, der einen Typ behandelt, im Anwendungscode vor einem catch-Block stehen, der seine Basistypen behandelt. Dies wird im Beispiel am Ende dieses Abschnitts veranschaulicht. Ein catch-Block, der System.Exception behandelt, wird zuletzt angegeben.

Wenn keiner der dem aktuellen try-Block zugeordneten catch-Blöcke die Ausnahme behandelt und der aktuelle try-Block beim aktuellen Aufruf in anderen try-Blöcken geschachtelt ist, werden die catch-Blöcke durchsucht, die dem nächsten umschließenden try-Block zugeordnet sind. Wenn kein catch-Block für die Ausnahme gefunden wird, durchsucht das System höhere Schachtelungsebenen im aktuellen Aufruf. Wenn für die Ausnahme im aktuellen Aufruf kein catch-Block gefunden wird, wird die Ausnahme gemäß der Aufrufliste weitergegeben, und der vorige Stapelrahmen wird nach einem catch-Block durchsucht, der die Ausnahme behandelt. Das Durchsuchen der Aufrufliste wird fortgesetzt, bis die Ausnahme behandelt wird oder in der Aufrufliste kein Stapelrahmen mehr vorhanden ist. Wenn der Anfang der Aufrufliste erreicht ist, ohne einen catch-Block für die Behandlung der Ausnahme zu finden, wird der Standardausnahmehandler aufgerufen, und die Anwendung wird beendet.

Ausnahmetypfunktionen

Die Ausnahmetypen unterstützen die folgenden Features:

  • Fehlerbeschreibungen im Klartext. Wenn eine Ausnahme auftritt, wird die Laufzeit eine Textmeldung, um den Benutzer über die Art des Fehlers zu informieren bereit und Aktion vorzuschlagen, das Problem zu beheben. Diese Textmeldung befindet sich in der Message-Eigenschaft des Ausnahmeobjekts. Beim Erstellen des Ausnahmeobjekts kann eine Zeichenfolge an den Konstruktor übergeben werden, in der die Einzelheiten dieser bestimmten Ausnahme beschrieben werden. Wenn kein Argument für die Fehlermeldung übergeben wird, wird die Standardfehlermeldung verwendet. Weitere Informationen finden Sie in den Ausführungen zur Message-Eigenschaft.

  • Der Zustand der Aufrufliste beim Auslösen der Ausnahme. Die StackTrace-Eigenschaft enthält eine Stapelüberwachung, die verwendet werden kann, um zu bestimmen, wo der Fehler im Code auftritt. Die Stapelüberwachung wird alle aufgerufenen Methoden und die Zeilennummern in der Quelldatei, in der die Aufrufe erfolgen.

Ausnahmeklasseneigenschaften

Die Exception-Klasse umfasst mehrere Eigenschaften, die helfen, den Codespeicherort, den Typ, die Hilfedatei und Ursache für die Ausnahme zu ermitteln: StackTrace, InnerException, Message, HelpLink, HResult, Source, TargetSite und Data.

Wenn zwischen zwei oder mehr Ausnahmen eine kausale Beziehung besteht, wird dies durch die InnerException-Eigenschaft wiedergegeben. Die äußere Ausnahme wird als Reaktion auf diese innere Ausnahme ausgelöst. Der Code, der die äußere Ausnahme behandelt, kann den Fehler anhand der Informationen über die innere Ausnahme auf geeignetere Weise behandeln. Ergänzungsinformationen zur Ausnahme können als Auflistung von Schlüssel-Wert-Paaren in der Data-Eigenschaft gespeichert werden.

Die Fehlermeldungszeichenfolge, die dem Konstruktor während der Erstellung des Ausnahmeobjekts übergeben wird, sollte befinden und kann aus einer Ressourcendatei angegeben werden, indem die ResourceManager-Klasse verwendet. Weitere Informationen über lokalisierte Ressourcen finden Sie die Themen Erstellen von Satellitenassemblys für Desktop-Apps und Verpacken und Bereitstellen von Ressourcen in Desktop-Apps.

Um zu gewährleisten den Benutzer mit umfassenden Informationen über warum die Ausnahme aufgetreten ist, kann die HelpLink-Eigenschaft eine URL (oder URN) zu einer Hilfedatei enthalten.

Die Exception-Klasse verwendet das HRESULT COR_E_EXCEPTION, das den Wert 0x80131500 hat.

Eine Liste der anfänglichen Eigenschaftswerte für eine Instanz der Exception-Klasse finden Sie unter den Exception-Konstruktoren.

Überlegungen zur Leistung

Eine Ausnahme auslösen oder Ausnahmebehandlung, nutzt eine signifikante Menge Systemressourcen und Ausführungszeit. Ausnahmen sollten nur zum Behandeln von wirklich außergewöhnlichen Bedingungen eingesetzt werden, nicht für die Behandlung von vorhersagbaren Ereignissen oder für die Ablaufsteuerung. Beispielsweise in einigen Fällen, wenn z Entwickeln einer Klassenbibliothek, ist es sinnvoll, eine Ausnahme auslösen, wenn ein Methodenargument ungültig ist, da die Methode erwartet, mit gültigen Parametern aufgerufen werden. Ein NULL-Makro Methodenargument, wenn sie nicht das Ergebnis eines Verwendungsfehlers ist, bedeutet, dass außerordentliches etwas Wichtiges geschehen ist. Andererseits lösen Sie aber keine Ausnahme aus, wenn Benutzereingaben ungültig ist, da Sie Benutzern erwarten können, ungültige Daten gelegentlich einzugeben. Stattdessen stellen Sie einen Wiederholungsmechanismus bereit, damit Benutzer gültigen Eingabe eingeben. Dennoch müssen Ausnahmen verwenden, um Verwendungsfehler zu behandeln. Verwenden Sie stattdessen Assertionen zu identifizieren und Fehler des richtigen Gebrauchs.

Außerdem lösen Sie aber keine Ausnahme aus, wenn ein Rückgabecode ausreicht; konvertieren Sie einen Rückgabecode keiner Ausnahme; und nicht routinemäßig fangen Sie eine Ausnahme, ignorieren Sie diese und fügen Sie dann die Verarbeitung fortgesetzt.

Auswählen von Standardausnahmen

Wenn Sie eine Ausnahme auslösen müssen, können Sie eine bestehende Ausnahme häufig verwenden in .NET Framework, anstatt, eine benutzerdefinierte Ausnahme zu implementieren. Sie sollten einen Standardausnahmetyp unter diesen zwei Bedingungen verwenden:

  • Sie lösen eine Ausnahme aus, die durch einen Verwendungsfehler verursacht wird (das bedeutet, durch einen Fehler in der Programmlogik der vom Entwickler, der die Methode aufruft). Normalerweise würden Sie eine Ausnahme wie ArgumentException, ArgumentNullException, InvalidOperationException oder NotSupportedException auslösen. Die Zeichenfolge, die an den Konstruktor des Ausnahmeobjekts stellen, wenn das Instanziieren des Ausnahmeobjekts den Fehler beschrieben werden sollte, sodass der Entwickler es beheben kann. Weitere Informationen finden Sie in den Ausführungen zur Message-Eigenschaft.

  • Sie behandeln einen Fehler, der zum Aufrufer mit einer vorhandenen .NET Framework-Ausnahme verwendet werden kann. Sie sollten die abgeleitetste mögliche Ausnahme auslösen. Wenn eine Methode z ein Argument benötigt, ein gültiger Member eines Enumerationstyps sein, müssen Sie InvalidEnumArgumentException (die am stärksten abgeleitete Klasse) anstatt ArgumentException auslösen.

Implementieren von benutzerdefinierten Ausnahmen

In den folgenden Fällen mit einer vorhandenen .NET Framework-Ausnahme, um den Fehlerzustand zu behandeln nicht geeignet:

  • Wenn die Ausnahme einen eindeutigen Programmausfälle widergespiegelt, der keiner vorhandenen .NET Framework-Ausnahme zugeordnet werden kann.

  • Wenn die Ausnahme Behandlung erforderlich, die zur Behandlung unterscheidet, die für eine vorhandene .NET Framework-Ausnahme oder die Ausnahme geeignet ist, muss von einer ähnlichen Ausnahme eindeutig bestimmt werden. Wenn Sie beispielsweise eine ArgumentOutOfRangeException Ausnahme auslösen, wenn die numerische Darstellung einer Zeichenfolge analysieren, die aus Zielganzzahligen Bereich des typs liegt, müssen Sie nicht die gleiche Ausnahme für einen Fehler verwenden werden, die vom Aufrufer entsteht, der nicht den entsprechenden Werten eingeschränkten angibt, wenn die Methode aufruft.

Die Exception-Klasse ist die Basisklasse aller Ausnahmen in .NET Framework. Viele abgeleiteten Klassen basieren auf das geerbte Verhalten der Member der Exception-Klasse; Überschreiben sie nicht die Member von Exception, und definieren alle eindeutigen Member.

Um eigene Ausnahmeklasse definieren:

  1. Definieren Sie eine Klasse, die von Exception erbt. Falls notwendig definieren Sie alle eindeutigen Member, die von der Klasse erforderlich werden, um zusätzliche Informationen zu der Ausnahme bereitstellen. Beispielsweise enthält die ArgumentException-Klasse ParamName eine Eigenschaft, die den Namen des Parameters, dessen Argument angibt die Ausnahme verursacht hat, und die RegexMatchTimeoutException-Eigenschaft enthält eine MatchTimeout-Eigenschaft, die das Timeoutintervall angibt.

  2. ggf. überschreiben Sie alle geerbten Member, deren Funktionen Sie ändern oder ändern möchten. Beachten Sie, dass die meisten vorhandenen abgeleiteten Klassen Exception nicht das Verhalten geerbter Member überschreiben.

  3. Bestimmen Sie, ob das benutzerdefinierte Ausnahmeobjekt serialisierbar ist. Serialisierung ermöglicht es Ihnen, Informationen über die Ausnahme zu speichern, Ausnahmeinformationen und so durch einen Server und einen Clientproxy in einem Remotingkontext aufgehoben werden. Damit das Ausnahmeobjekt serialisierbar zu machen, kennzeichnen Sie ihn mit dem Attribut SerializableAttribute.

  4. Definieren Sie die Konstruktoren der Ausnahmeklasse. In der Regel haben Ausnahmeklassen eine oder mehrere folgenden Konstruktoren:

    • Exception() , die Standardwerte verwendet, um die Eigenschaften eines Ausnahmeobjekts neuen zu initialisieren.

    • Exception(String) , das ein neues Ausnahmeobjekt mit einer bestimmten Fehlermeldung initialisiert.

    • Exception(String, Exception) , das ein neues Ausnahmeobjekt mit einer bestimmten Fehlermeldung und einer inneren Ausnahme initialisiert.

    • Exception(SerializationInfo, StreamingContext) , einen protected-Konstruktor ist, der ein neues Ausnahmeobjekt von den serialisierten Daten initialisiert. Sie sollten diesen Konstruktor implementieren, wenn Sie festgelegt haben, dass das Ausnahmeobjekt serialisierbar zu machen.

Das folgende Beispiel veranschaulicht die Verwendung einer benutzerdefinierten Ausnahmeklasse. Es definiert eine NotPrimeException Ausnahme, die ausgelöst wird, wenn ein Client versucht, eine Sequenz der Primzahlen abzurufen, indem er eine Startzahl angibt, die keine Primzahl ist. Die Ausnahme definiert eine neue Eigenschaft, NonPrime, die keine Primzahlen Zahl zurückgibt, die die Ausnahme verursacht hat. Zusätzlich zum Implementieren eines geschützten parameterlosen Konstruktors und des Konstruktors mit SerializationInfo und der StreamingContext-Parameter für Serialisierung, definiert die NotPrimeException-Klasse drei zusätzliche Konstruktoren, um die Eigenschaft NonPrime zu unterstützen. Jeder Konstruktor ruft einen Basisklassenkonstruktor zusätzlich zum Beibehalten des Werts der keine Primzahlen Zahl auf. Die NotPrimeException-Klasse wird auch dem SerializableAttribute-Attribut markiert.


using System;
using System.Runtime.Serialization;

[Serializable()]
public class NotPrimeException : Exception
{
   private int notAPrime;

   protected NotPrimeException()
      : base()
   { }

   public NotPrimeException(int value) :
      base(String.Format("{0} is not a prime number.", value))
   {
      notAPrime = value;
   }

   public NotPrimeException(int value, string message)
      : base(message)
   {
      notAPrime = value;
   }

   public NotPrimeException(int value, string message, Exception innerException) :
      base(message, innerException)
   {
      notAPrime = value;
   }

   protected NotPrimeException(SerializationInfo info,
                               StreamingContext context)
      : base(info, context)
   { }

   public int NonPrime
   { get { return notAPrime; } }
}


Die PrimeNumberGenerator-Klasse, die im folgenden Beispiel gezeigt wird, verwendet das Sieb des Eratosthenes, um die Sequenz der Primzahlen von 2 zu einer Grenze zu berechnen, die vom Client im Aufruf an den Klassenkonstruktor angegeben wird. Die GetPrimesFrom-Methode gibt alle Primzahlen, die größer oder gleich eine bestimmte Untergrenze sind, jedoch auslöst NotPrimeException zurück, wenn die Untergrenze keine Primzahl ist.


using System;
using System.Collections.Generic;


[Serializable]
public class PrimeNumberGenerator
{
   private const int START = 2;
   private int maxUpperBound = 10000000;
   private int upperBound;
   private bool[] primeTable;
   private List<int> primes = new List<int>();

   public PrimeNumberGenerator(int upperBound)
   {
      if (upperBound > maxUpperBound)
      {
         string message = String.Format(
                           "{0} exceeds the maximum upper bound of {1}.",
                           upperBound, maxUpperBound);
         throw new ArgumentOutOfRangeException(message);
      }
      this.upperBound = upperBound;
      // Create array and mark 0, 1 as not prime (True).
      primeTable = new bool[upperBound + 1];
      primeTable[0] = true;
      primeTable[1] = true;

      // Use Sieve of Eratosthenes to determine prime numbers.
      for (int ctr = START; ctr <= (int)Math.Ceiling(Math.Sqrt(upperBound));
            ctr++)
      {
         if (primeTable[ctr]) continue;

         for (int multiplier = ctr; multiplier <= upperBound / ctr; multiplier++)
            if (ctr * multiplier <= upperBound) primeTable[ctr * multiplier] = true;
      }
      // Populate array with prime number information.
      int index = START;
      while (index != -1)
      {
         index = Array.FindIndex(primeTable, index, (flag) => !flag);
         if (index >= 1)
         {
            primes.Add(index);
            index++;
         }
      }
   }

   public int[] GetAllPrimes()
   {
      return primes.ToArray();
   }

   public int[] GetPrimesFrom(int prime)
   {
      int start = primes.FindIndex((value) => value == prime);
      if (start < 0)
         throw new NotPrimeException(prime, String.Format("{0} is not a prime number.", prime));
      else
         return primes.FindAll((value) => value >= prime).ToArray();
   }
}


Im folgenden Beispiel werden zwei Aufrufe der GetPrimesFrom-Methode mit Zahlen, die keine Primzahlen von denen eine Anwendungsdomänengrenzen überschreitet. In beiden Fällen wird die Ausnahme ausgelöst und behandelt erfolgreich im Clientcode.


using System;
using System.Reflection;

class Example
{
   public static void Main()
   {
      int limit = 10000000;
      PrimeNumberGenerator primes = new PrimeNumberGenerator(limit);
      int start = 1000001;
      try
      {
         int[] values = primes.GetPrimesFrom(start);
         Console.WriteLine("There are {0} prime numbers from {1} to {2}",
                           start, limit);
      }
      catch (NotPrimeException e)
      {
         Console.WriteLine("{0} is not prime", e.NonPrime);
         Console.WriteLine(e);
         Console.WriteLine("--------");
      }

      AppDomain domain = AppDomain.CreateDomain("Domain2");
      PrimeNumberGenerator gen = (PrimeNumberGenerator)domain.CreateInstanceAndUnwrap(
                                        typeof(Example).Assembly.FullName,
                                        "PrimeNumberGenerator", true,
                                        BindingFlags.Default, null,
                                        new object[] { 1000000 }, null, null);
      try
      {
         start = 100;
         Console.WriteLine(gen.GetPrimesFrom(start));
      }
      catch (NotPrimeException e)
      {
         Console.WriteLine("{0} is not prime", e.NonPrime);
         Console.WriteLine(e);
         Console.WriteLine("--------");
      }
   }
}


Windows-Runtime und .NET Framework 4.5.1

In .NET für Windows Store-Apps für Windows 8, können einige Ausnahmeinformationen in der Regel verloren gehen, wenn eine Ausnahme von .NET Framework erstellten Anwendungen Frameworkstapelrahmen weitergegeben wird. Ab .NET Framework 4.5.1 und Windows 8.1, wird die Common Language Runtime ausgeführt, um das ursprüngliche Exception-Objekt zu verwenden, das ausgelöst werden, es sei denn, diese Ausnahme mit einem .NET Framework erstellten Anwendungen Frameworkstapelrahmen geändert wurde.

Das folgende Beispiel zeigt einen catch-Block, der definiert wird, um ArithmeticException Fehler zu behandeln. Dieser catch-Block fängt auch DivideByZeroException Fehler ab, da DivideByZeroException von ArithmeticException abgeleitet und kein catch-Block vorhanden ist, der explizit für DivideByZeroException Fehler definiert wird.


using System;

class ExceptionTestClass 
{
   public static void Main() 
   {
      int x = 0;
      try 
      {
         int y = 100/x;
      }
         catch (ArithmeticException e) 
         {
            Console.WriteLine("ArithmeticException Handler: {0}", e.ToString());
         }
         catch (Exception e) 
         {
            Console.WriteLine("Generic Exception Handler: {0}", e.ToString());
         }
   }	
}
/*
This code example produces the following results:

ArithmeticException Handler: System.DivideByZeroException: Attempted to divide by zero.
   at ExceptionTestClass.Main()

*/


.NET Framework

Unterstützt in: 4.5.2, 4.5.1, 4.5, 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Unterstützt in: 4, 3.5 SP1

Portable Klassenbibliothek

Unterstützt in: Portable Klassenbibliothek

.NET für Windows Store-Apps

Unterstützt in: Windows 8

.NET für Windows Phone-Apps

Unterstützt in: Windows Phone 8, Silverlight 8.1

Windows Phone 8.1, Windows Phone 8, Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core-Rolle wird nicht unterstützt), Windows Server 2008 R2 (Server Core-Rolle wird mit SP1 oder höher unterstützt; Itanium wird nicht unterstützt)

.NET Framework unterstützt nicht alle Versionen sämtlicher Plattformen. Eine Liste der unterstützten Versionen finden Sie unter Systemanforderungen für .NET Framework.

Alle öffentlichen static (Shared in Visual Basic)-Member dieses Typs sind threadsicher. Bei Instanzmembern ist die Threadsicherheit nicht gewährleistet.

System.Object
  System.Exception
    Microsoft.Build.BuildEngine.InternalLoggerException
    Microsoft.Build.BuildEngine.InvalidProjectFileException
    Microsoft.Build.BuildEngine.InvalidToolsetDefinitionException
    Microsoft.Build.BuildEngine.RemoteErrorException
    Microsoft.Build.Exceptions.BuildAbortedException
    Microsoft.Build.Exceptions.InternalLoggerException
    Microsoft.Build.Exceptions.InvalidProjectFileException
    Microsoft.Build.Exceptions.InvalidToolsetDefinitionException
    Microsoft.Build.Framework.LoggerException
    Microsoft.CSharp.RuntimeBinder.RuntimeBinderException
    Microsoft.CSharp.RuntimeBinder.RuntimeBinderInternalCompilerException
    Microsoft.JScript.CmdLineException
    Microsoft.JScript.ParserException
    Microsoft.VisualBasic.ApplicationServices.CantStartSingleInstanceException
    Microsoft.VisualBasic.ApplicationServices.NoStartupFormException
    Microsoft.VisualBasic.Compatibility.VB6.WebClassContainingClassNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebClassCouldNotFindEvent
    Microsoft.VisualBasic.Compatibility.VB6.WebClassNextItemCannotBeCurrentWebItem
    Microsoft.VisualBasic.Compatibility.VB6.WebClassNextItemRespondNotFound
    Microsoft.VisualBasic.Compatibility.VB6.WebClassUserWebClassNameNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebClassWebClassFileNameNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebClassWebItemNotValid
    Microsoft.VisualBasic.Compatibility.VB6.WebItemAssociatedWebClassNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebItemClosingTagNotFound
    Microsoft.VisualBasic.Compatibility.VB6.WebItemCouldNotLoadEmbeddedResource
    Microsoft.VisualBasic.Compatibility.VB6.WebItemCouldNotLoadTemplateFile
    Microsoft.VisualBasic.Compatibility.VB6.WebItemNameNotOptional
    Microsoft.VisualBasic.Compatibility.VB6.WebItemNoTemplateSpecified
    Microsoft.VisualBasic.Compatibility.VB6.WebItemTooManyNestedTags
    Microsoft.VisualBasic.Compatibility.VB6.WebItemUnexpectedErrorReadingTemplateFile
    Microsoft.VisualBasic.CompilerServices.IncompleteInitialization
    Microsoft.VisualBasic.CompilerServices.InternalErrorException
    Microsoft.VisualBasic.FileIO.MalformedLineException
    System.Activities.DynamicUpdate.InstanceUpdateException
    System.Activities.ExpressionParser.SourceExpressionException
    System.Activities.Expressions.LambdaSerializationException
    System.Activities.InvalidWorkflowException
    System.Activities.Presentation.Metadata.AttributeTableValidationException
    System.Activities.Statements.WorkflowTerminatedException
    System.Activities.VersionMismatchException
    System.Activities.WorkflowApplicationException
    System.AddIn.Hosting.AddInSegmentDirectoryNotFoundException
    System.AddIn.Hosting.InvalidPipelineStoreException
    System.AggregateException
    System.ApplicationException
    System.ComponentModel.Composition.CompositionContractMismatchException
    System.ComponentModel.Composition.CompositionException
    System.ComponentModel.Composition.ImportCardinalityMismatchException
    System.ComponentModel.Composition.Primitives.ComposablePartException
    System.ComponentModel.DataAnnotations.ValidationException
    System.ComponentModel.Design.ExceptionCollection
    System.Configuration.Provider.ProviderException
    System.Configuration.SettingsPropertyIsReadOnlyException
    System.Configuration.SettingsPropertyNotFoundException
    System.Configuration.SettingsPropertyWrongTypeException
    System.Data.Linq.ChangeConflictException
    System.Diagnostics.Eventing.Reader.EventLogException
    System.Diagnostics.Tracing.EventSourceException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectExistsException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryObjectNotFoundException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryOperationException
    System.DirectoryServices.ActiveDirectory.ActiveDirectoryServerDownException
    System.DirectoryServices.Protocols.DirectoryException
    System.IdentityModel.AsynchronousOperationException
    System.IdentityModel.Metadata.MetadataSerializationException
    System.IdentityModel.Protocols.WSTrust.WSTrustSerializationException
    System.IdentityModel.RequestException
    System.IdentityModel.Selectors.CardSpaceException
    System.IdentityModel.Selectors.IdentityValidationException
    System.IdentityModel.Selectors.PolicyValidationException
    System.IdentityModel.Selectors.ServiceBusyException
    System.IdentityModel.Selectors.ServiceNotStartedException
    System.IdentityModel.Selectors.StsCommunicationException
    System.IdentityModel.Selectors.UnsupportedPolicyOptionsException
    System.IdentityModel.Selectors.UntrustedRecipientException
    System.IdentityModel.Selectors.UserCancellationException
    System.IdentityModel.Services.AsynchronousOperationException
    System.IdentityModel.Services.FederatedAuthenticationSessionEndingException
    System.IdentityModel.Services.FederationException
    System.IdentityModel.Services.WSFederationMessageException
    System.InvalidTimeZoneException
    System.IO.IsolatedStorage.IsolatedStorageException
    System.IO.Log.SequenceFullException
    System.Management.Instrumentation.InstrumentationBaseException
    System.Management.Instrumentation.WmiProviderInstallationException
    System.Net.Http.HttpRequestException
    System.Net.Mail.SmtpException
    System.Net.PeerToPeer.PeerToPeerException
    System.Runtime.CompilerServices.RuntimeWrappedException
    System.Runtime.DurableInstancing.InstancePersistenceException
    System.Runtime.Remoting.MetadataServices.SUDSGeneratorException
    System.Runtime.Remoting.MetadataServices.SUDSParserException
    System.Runtime.Serialization.InvalidDataContractException
    System.Security.RightsManagement.RightsManagementException
    System.ServiceModel.Channels.InvalidChannelBindingException
    System.SystemException
    System.Threading.BarrierPostPhaseException
    System.Threading.LockRecursionException
    System.Threading.Tasks.TaskSchedulerException
    System.TimeZoneNotFoundException
    System.Web.Query.Dynamic.ParseException
    System.Web.Security.MembershipCreateUserException
    System.Web.Security.MembershipPasswordException
    System.Web.UI.ViewStateException
    System.Web.UI.WebControls.EntityDataSourceValidationException
    System.Web.UI.WebControls.LinqDataSourceValidationException
    System.Windows.Automation.NoClickablePointException
    System.Windows.Automation.ProxyAssemblyNotLoadedException
    System.Windows.Controls.PrintDialogException
    System.Windows.Forms.AxHost.InvalidActiveXStateException
    System.Windows.Xps.XpsException
    System.Windows.Xps.XpsWriterException
    System.Workflow.Activities.Rules.RuleException
    System.Workflow.ComponentModel.Compiler.WorkflowValidationFailedException
    System.Workflow.ComponentModel.Serialization.WorkflowMarkupSerializationException
    System.Workflow.ComponentModel.WorkflowTerminatedException
    System.Workflow.Runtime.WorkflowOwnershipException
    System.Xaml.XamlException

Community-Beiträge

HINZUFÜGEN
Anzeigen:
© 2015 Microsoft