FehlerbehandlungError handling

Fehlerbehandlung in Windows Communication FoundationError Handling in Windows Communication Foundation

Wenn in einem Dienst eine unerwartete Ausnahme oder ein unerwarteter Fehler auftritt, gibt es mehrere Möglichkeiten zum Entwerfen einer Lösung für die Ausnahmebehandlung.When a service encounters an unexpected exception or error, there are multiple ways to design an exception-handling solution. Es gibt zwar keine einzelnen "richtig" oder "best Practices" Fehlerbehandlungs-Lösung stehen mehrere Möglichkeiten für eine zu berücksichtigen.While there is no single "correct" or "best practice" error-handling solution, there are multiple valid paths for one to consider. Normalerweise empfohlen, eine Hybrid-Lösung implementieren, die mehrere Ansätze aus der Liste unten, je nach Komplexität der WCF-Implementierung, Typ und Häufigkeit der Ausnahmen, die behandelten im Vergleich zu nicht behandelte Charakter kombiniert die Ausnahmen und alle zugehörigen Ablaufverfolgung, Protokollierung oder richtlinienanforderungen.It is normally recommended that one implement a hybrid solution that combines multiple approaches from the list below, depending on the complexity of the WCF implementation, the type and frequency of the exceptions, the handled vs. unhandled nature of the exceptions, and any associated tracing, logging, or policy requirements.

Diese Lösungen werden im restlichen Teil dieses Abschnitts genauer erläutert.These solutions are explained more deeply in the rest of this section.

Die Microsoft Enterprise LibraryThe Microsoft Enterprise Library

Der Ausnahmebehandlungs-Anwendungsblock der Microsoft Enterprise Library erleichtert das Implementieren häufiger Entwurfsmuster und das Erstellen einer einheitlichen Strategie für die Verarbeitung von Ausnahmen, die auf allen Architekturebenen einer Unternehmensanwendung auftreten.The Microsoft Enterprise Library Exception Handling Application Block helps implement common design patterns and create a consistent strategy for processing exceptions that occur in all architectural layers of an enterprise application. Er unterstützt den typischen Code in den Catch-Anweisungen von Anwendungskomponenten.It is designed to support the typical code contained in catch statements in application components. Statt diesen Code (z. B. Code zum Protokollieren von Ausnahmeinformationen) in der gesamten Anwendung in identischen Catch-Blöcken zu wiederholen, ermöglicht der Ausnahmebehandlungs-Anwendungsblock Entwicklern das Kapseln dieser Logik als wiederverwendbare Ausnahmehandler.Instead of repeating this code (such as code that logs exception information) in identical catch blocks throughout an application, the Exception Handling Application Block allows developers to encapsulate this logic as reusable exception handlers.

Diese Bibliothek enthält standardmäßig einen Fehlervertragsausnahmehandler.This Library includes out-of-the-box a Fault Contract Exception Handler. Dieser Ausnahmehandler ist für die Verwendung an den Grenzen des WCF-Diensts (Windows® Communication Foundation) vorgesehen und generiert aus der Ausnahme einen neuen Fehlervertrag.This exception handler is designed for use at Windows® Communication Foundation (WCF) service boundaries, and generates a new Fault Contract from the exception.

Anwendungsblöcke enthalten in der Regel häufig verwendete bewährte Methoden und bieten eine allgemeine Vorgehensweise für die Ausnahmebehandlung in der gesamten Anwendung.Application blocks aim to incorporate commonly used best practices and provide a common approach for exception handling throughout your application. Jedoch können benutzerdefinierte Fehlerhandler und Fehlerverträge, die selbst entwickelt wurden, ebenfalls sehr hilfreich sein.On the other hand, custom error handlers and fault contracts developed on one’s own can also be very useful. Benutzerdefinierte Fehlerhandler geben z. B. eine hervorragende Möglichkeit, automatisch alle Ausnahmen FaultExceptions höher stufen und Protokollierungsfunktionen zu einer Anwendung hinzufügen.For instance, custom error handlers provide an excellent opportunity to automatically promote all exceptions to FaultExceptions and also to add logging capabilities to your application.

Weitere Informationen finden Sie unter Microsoft Enterprise Library.For more information, please see Microsoft Enterprise Library.

Behandeln von erwarteten AusnahmenDealing with Expected Exceptions

Die richtige Vorgehensweise besteht darin, zu Abfangen erwarteter Ausnahmen in jedem Vorgang oder relevanten Erweiterungspunkt entscheiden, ob sie wiederhergestellt werden können, und geben Sie den ordnungsgemäßen benutzerdefinierten Fehler in ein FaultException-Element zurück<T >The proper course of action is to catch expected exceptions in every operation or relevant extensibility point, decide whether they can be recovered from, and return the proper custom fault in a FaultException<T>

Behandeln von unerwarteten Ausnahmen mit einem IErrorHandlerDealing with Unexpected Exceptions using an IErrorHandler

Die empfohlene Vorgehensweise darin, um unerwartete Ausnahmen behandeln, ein IErrorHandler "verknüpfen".To deal with unexpected exceptions, the recommended course of action is to "hook" an IErrorHandler. Fehlerhandler fangen nur Ausnahmen, die WCF-Laufzeitebene (der "" dienstmodellebene), nicht auf der Kanalebene.Error handlers only catch exceptions at the WCF runtime level (the "service model" layer), not at the channel layer. Die einzige Möglichkeit, einen "IErrorHandler" auf Kanalebene zu verknüpfen, ist das Erstellen eines benutzerdefinierten Kanals, und dies wird in den meisten Szenarien nicht empfohlen.The only way to hook an IErrorHandler at the channel level is to create a custom channel, which is not recommended in most scenarios.

"Unerwartete Ausnahme" ist im Allgemeinen weder eine nicht behebbare Ausnahme noch eine Ausnahme für die Verarbeitung. Es wird stattdessen eine unerwartete Benutzerausnahme.An "unexpected exception" is generally neither an irrecoverable exception nor a processing exception; it is, instead, an unexpected user exception. Eine nicht behebbare Ausnahme (z. B. eine Out-of-Memory-Ausnahme) – eine in der Regel von behandelt die Dienstmodell-Ausnahmehandler automatisch – kann nicht in der Regel unauffällig behandelt werden, und der einzige Grund, eine Ausnahme zu behandeln. Alle möglicherweise zusätzliche Protokollierung oder eine Standardausnahme an den Client zurückzugeben.An irrecoverable exception (such as an out-of-memory exception) – one generally handled by the Service Model Exception Handler automatically – cannot generally be handled gracefully, and the only reason to handle such an exception at all may be do additional logging or to return a standard exception to the client. Eine Verarbeitungsausnahme tritt meist beim Verarbeiten der Nachricht auf, beispielsweise auf Serialisierungs-, Encoder- oder Formatiererebene, und kann im Allgemeinen nicht von einem "IErrorHandler" behandelt werden, weil die Fehlerbehandlung noch nicht oder nicht mehr eingreifen kann, wenn diese Ausnahmen auftreten.A processing exception occurs in the processing of the message – for example, at the serialization, encoder, or formatter level – generally cannot be handled at an IErrorHandler, because it is generally either too early or too late for the error handler to intervene by the time these exceptions occur. Ebenso können Transportausnahmen nicht von einem IErrorHandler behandelt werden.Similarly, transport exceptions cannot be handled at an IErrorHandler.

Mit einem IErrorHandler können Sie das Verhalten der Anwendung explizit steuern, wenn eine Ausnahme ausgelöst wird.With an IErrorHandler, you can explicitly control the behavior of your application when an exception is thrown. Sie haben folgende Möglichkeiten:You may:

  1. Entscheiden, ob ein Fehler an den Client gesendet wirdDecide whether or not to send a fault to the client

  2. Ersetzen einer Ausnahme durch einen FehlerReplace an exception with a fault

  3. Ersetzen eines Fehlers durch einen anderen FehlerReplace a fault with another fault

  4. Ausführen von Protokollierung oder AblaufverfolgungPerform logging or tracing

  5. Ausführen von anderen benutzerdefinierten AktivitätenPerform other custom activities

Sie können einen benutzerdefinierten Fehlerhandler installieren, indem Sie ihn der ErrorHandlers-Eigenschaft der Kanalverteiler für den Dienst hinzufügen.One can install a custom error handler by adding it to the ErrorHandlers property of the channel dispatchers for your service. Es ist zulässig, mehrere Fehlerhandler zu verwenden. Sie werden in der Reihenfolge aufgerufen, in der sie der Auflistung hinzugefügt wurden.It is possible to have more than one error handler and they are called in the order they are added to this collection.

IErrorHandler.ProvideFault steuert die Fehlermeldung, die an den Client gesendet wird.IErrorHandler.ProvideFault controls the fault message that is sent to the client. Diese Methode wird unabhängig vom Typ der Ausnahme aufgerufen, die durch einen Vorgang im Dienst ausgelöst wird.This method is called regardless of the type of the exception thrown by an operation in your service. Wenn hier kein Vorgang ausgeführt wird, wird WCF mit dem Standardverhalten fortgesetzt und auf die gleiche Weise wie ohne benutzerdefinierte Fehlerhandler ausgeführt.If no operation is performed here, WCF assumes its default behaviour and continues as if there were no custom error handlers in place.

Sie können diese Herangehensweise beispielsweise verwenden, wenn Ausnahmen an einer zentralen Stelle in Fehler umgewandelt werden sollen, bevor sie an den Client gesendet werden (um sicherzustellen, dass die Instanz nicht verworfen wird und der Kanal nicht in den Faulted-Zustand wechselt).One area that you could perhaps use this approach is when you want to create a central place for converting exceptions to faults before they are sent to the client (ensuring that the instance is not disposed and the channel is not moved to the Faulted state).

Die "IErrorHandler.HandleError"-Methode wird in der Regel verwendet, um Verhalten für Fehler zu implementieren, z. B. Fehlerprotokollierung, Systembenachrichtigungen, Beenden der Anwendung usw. "IErrorHandler.HandleError" kann an mehreren Stellen im Dienst aufgerufen werden. Je nachdem, wo der Fehler ausgelöst wird, erfolgt der Aufruf der "HandleError"-Methode vom selben Thread wie der Vorgang oder auch nicht. Dies lässt sich nicht eindeutig festlegen.The IErrorHandler.HandleError method is usually used to implement error-related behaviors such as error logging, system notifications, shutting down the application, etc. IErrorHandler.HandleError can be called at multiple places inside the service, and depending on where the error is thrown, the HandleError method may or may not be called by the same thread as the operation; no guarantees are made in this regard.

Behandeln von Ausnahmen außerhalb von WCFDealing with Exceptions outside WCF

Häufig treten Konfigurationsausnahmen, Ausnahmen im Hinblick auf Datenbankverbindungszeichenfolgen und ähnliche Ausnahmen im Kontext einer WCF-Anwendung auf, ohne vom Dienstmodell oder vom Webdienst selbst verursacht worden zu sein.Often, configuration exceptions, database connection string exceptions, and other similar exceptions may occur within the context of a WCF application, but are themselves are not exceptions caused by the service model or the web service itself. Diese Ausnahmen sind "normale" Ausnahmen außerhalb des Webdiensts, und behandelt werden sollen, ebenso wie andere externen Ausnahmen in der Umgebung behandelt werden.These exceptions are "regular" exceptions external to the web service, and should be handled just as other external exceptions in the environment are to be handled.

Ablaufverfolgung von AusnahmenTracing exceptions

Die Ablaufverfolgung ist die nur "Catch-All" Stelle, wo eine potenziell alle Ausnahmen finden können.Tracing is the only "catch-all" place where one can potentially see all exceptions. Weitere Informationen zur Ablaufverfolgung und Protokollierung von Ausnahmen finden Sie unter "Ablaufverfolgung und Protokollierung".For more information on tracing and logging exceptions, see Tracing and Logging.

URI-Vorlagenfehler bei Verwendung von WebGetAttribute und WebInvokeAttributeURI template errors when using WebGetAttribute and WebInvokeAttribute

Mit dem WebGet-Attribut und dem WebInvoke-Attribut können Sie eine URI-Vorlage angeben, die Vorgangsparametern Komponenten der Anforderungsadresse zuordnet.The WebGet and WebInvoke attributes allow you to specify a URI template that maps components of the request address to operation parameters. Beispielsweise ordnet die URI-Vorlage "weather/{state}/{city}" die Anforderungsadresse als Literaltoken, als Parameter mit dem Namen state und als Parameter mit dem Namen city zu.For example, the URI template "weather/{state}/{city}" maps the request address into literal tokens, a parameter named state, and a parameter named city. Diese Parameter können dann nach Name an einige der formalen Parameter des Vorgangs gebunden werden.These parameters might then be bound by name to some of the formal parameters of the operation.

Die Vorlagenparameter werden im URI als Zeichenfolgen angezeigt, während die formalen Parameter eines typisierten Vertrags möglicherweise nicht vom Typ String sind.The template parameters appear in the form of strings within the URI while the formal parameters of a typed contract might be of non-string types. Daher muss eine Konvertierung erfolgen, bevor der Vorgang aufgerufen werden kann.Therefore, a conversion needs to take place before the operation can be invoked. Ein Tabelle der konvertierungsformate verfügbar ist.A table of conversion formats is available.

Wenn jedoch die Konvertierung fehlschlägt, gibt es keine Möglichkeit, dies dem Vorgang zu signalisieren.However, if the conversion fails, then there's no way to let the operation know that something has gone wrong. Stattdessen wird für die Typkonvertierung ein Verteilungsfehler ausgegeben.The type conversion instead surfaces in the form of a dispatch failure.

Ein Typkonvertierungs-Verteilungsfehler kann wie viele andere Typen von Verteilungsfehlern durch das Installieren eines Fehlerhandlers überprüft werden.A type conversion dispatch failure can be inspected the same as with many other types of dispatch failures by installing an error handler. Der "IErrorHandler"-Erweiterungspunkt wird aufgerufen, um auf Dienstebene aufgetretene Ausnahmen zu behandeln.The IErrorHandler extensibility point is called to handle service-level exceptions. Dort kann die an den Aufrufer zurückzusendende Antwort ausgewählt werden, und es lassen sich benutzerdefinierte Aufgaben ausführen und Berichte erstellen.From there, the response to be sent back to the caller – as well as perform any custom tasks and reporting – may be chosen.

Siehe auchSee Also

Basis-WCF-FehlerbehandlungBasic WCF Error Handling