RegexMatchTimeoutException Klasse

Definition

Die Ausnahme, die ausgelöst wird, wenn beim Ausführen einer Mustervergleichsmethode mit regulärem Ausdruck das Timeoutintervall überschritten wird.

public ref class RegexMatchTimeoutException : TimeoutException
public class RegexMatchTimeoutException : TimeoutException
[System.Serializable]
public class RegexMatchTimeoutException : TimeoutException
type RegexMatchTimeoutException = class
    inherit TimeoutException
type RegexMatchTimeoutException = class
    inherit TimeoutException
    interface ISerializable
[<System.Serializable>]
type RegexMatchTimeoutException = class
    inherit TimeoutException
    interface ISerializable
Public Class RegexMatchTimeoutException
Inherits TimeoutException
Vererbung
RegexMatchTimeoutException
Vererbung
RegexMatchTimeoutException
Attribute
Implementiert

Beispiele

Im folgenden Beispiel werden zwei mögliche Ansätze zur Behandlung der RegexMatchTimeoutException Ausnahme veranschaulicht. Eine Konstante, deren Wert zwei Sekunden beträgt, definiert das maximale Timeoutintervall. Die Regex.IsMatch(String, String, RegexOptions, TimeSpan) Methode wird zunächst mit einem Timeoutintervall von einer Sekunde aufgerufen. Jede RegexMatchTimeoutException Ausnahme bewirkt, dass das Timeoutintervall um eine Sekunde erhöht wird und ein anderer Aufruf zur Regex.IsMatch Methode führt, wenn das aktuelle Timeoutintervall kleiner als das maximale Timeoutintervall ist. Wenn das aktuelle Timeoutintervall jedoch das maximale Timeoutintervall überschreitet, schreibt der Ausnahmehandler Informationen in das Ereignisprotokoll und verlässt die Verarbeitung des regulären Ausdrucks.

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Security;
using System.Text.RegularExpressions;
using System.Threading;

public class Example
{
   const int MaxTimeoutInSeconds = 2;
   
   public static void Main()
   {
      TimeSpan timeout = new TimeSpan(0, 0, 1);
      string input = "aaaaaaaaaaaaaaaaaaaaaa>";
      if (ValidateInput(input, timeout))
         // Perform some operation with valid input string.
         Console.WriteLine("'{0}' is a valid string.", input); 
   } 

   private static bool ValidateInput(string input, TimeSpan timeout)
   {
      string pattern = "(a+)+$";      
      try {
         return Regex.IsMatch(input, pattern, 
                              RegexOptions.IgnoreCase, timeout);
      }
      catch (RegexMatchTimeoutException e) {
         // Increase the timeout interval and retry.
         timeout = timeout.Add(new TimeSpan(0, 0, 1));
         Console.WriteLine("Changing the timeout interval to {0}", 
                           timeout); 
         if (timeout.TotalSeconds <= MaxTimeoutInSeconds) {
            // Pause for a short period.
            Thread.Sleep(250);
            return ValidateInput(input, timeout);
         }   
         else {
            Console.WriteLine("Timeout interval of {0} exceeded.", 
                              timeout);
            // Write to event log named RegexTimeouts
            try {
               if (! EventLog.SourceExists("RegexTimeouts"))
                  EventLog.CreateEventSource("RegexTimeouts", "RegexTimeouts");

               EventLog log = new EventLog("RegexTimeouts");
               log.Source = "RegexTimeouts";
               string msg = String.Format("Timeout after {0} matching '{1}' with '{2}.",
                                          e.MatchTimeout, e.Input, e.Pattern);
               log.WriteEntry(msg, EventLogEntryType.Error);
            }
            // Do nothing to handle the exceptions.
            catch (SecurityException) { }
            catch (InvalidOperationException) { }
            catch (Win32Exception) { }
            return false;
         }   
      }
   }
}
// The example writes to the event log and also displays the following output:
//       Changing the timeout interval to 00:00:02
//       Changing the timeout interval to 00:00:03
//       Timeout interval of 00:00:03 exceeded.
Imports System.ComponentModel
Imports System.Diagnostics
Imports System.Security
Imports System.Text.RegularExpressions
Imports System.Threading

Module Example
   Const MaxTimeoutInSeconds As Integer = 2
   
   Public Sub Main()
      Dim timeout As TimeSpan = New TimeSpan(0, 0, 1)
      
      Dim input As String = "aaaaaaaaaaaaaaaaaaaaaa>"
      If ValidateInput(input, timeout) Then
         ' Perform some operation with valid input string.
         Console.WriteLine("'{0}' is a valid string.", input) 
      End If
   End Sub 

   Private Function ValidateInput(input As String, 
                                  timeout As TimeSpan) As Boolean
      Dim pattern As String = "(a+)+$"      
      Try
         Return Regex.IsMatch(input, pattern, 
                              RegexOptions.IgnoreCase, timeout)
      Catch e As RegexMatchTimeoutException
         ' Increase the timeout interval and retry.
         timeout = timeout.Add(New TimeSpan(0, 0, 1))
         Console.WriteLine("Changing the timeout interval to {0}", 
                           timeout) 
         If timeout.TotalSeconds <= MaxTimeoutInSeconds Then
            ' Pause for a short interval.
            Thread.Sleep(250)
            Return ValidateInput(input, timeout)
         Else
            Console.WriteLine("Timeout interval of {0} exceeded.", 
                              timeout)
            ' Write to event log named RegexTimeouts
            Try
               If Not EventLog.SourceExists("RegexTimeouts") Then
                  EventLog.CreateEventSource("RegexTimeouts", "RegexTimeouts")
               End If   
               Dim log As New EventLog("RegexTimeouts")
               log.Source = "RegexTimeouts"
               Dim msg As String = String.Format("Timeout after {0} matching '{1}' with '{2}.",
                                                 e.MatchTimeout, e.Input, e.Pattern)
               log.WriteEntry(msg, EventLogEntryType.Error)
            ' Do nothing to handle the exceptions.
            Catch ex As SecurityException

            Catch ex As InvalidOperationException

            Catch ex As Win32Exception

            End Try   
            Return False
         End If   
      End Try
   End Function
End Module
' The example writes to the event log and also displays the following output:
'       Changing the timeout interval to 00:00:02
'       Changing the timeout interval to 00:00:03
'       Timeout interval of 00:00:03 exceeded.

Hinweise

Die Anwesenheit einer Ausnahme gibt in der Regel eine RegexMatchTimeoutException der folgenden Bedingungen an:

  • Das reguläre Ausdrucksmodul wird übermäßig nachverfolgt, da er versucht, den Eingabetext mit dem regulären Ausdrucksmuster übereinzugleichen.

  • Das Timeoutintervall wurde zu niedrig festgelegt, insbesondere bei hoher Maschinenlast.

Die Art und Weise, in der ein Ausnahmehandler eine Ausnahme behandelt, hängt von der Ursache der Ausnahme ab:

  • Wenn die Timeout-Ergebnisse aus übermäßigem Backtracking resultieren, sollte der Ausnahmehandler den Versuch verlassen, die Eingabe zu vergleichen und den Benutzer darüber zu informieren, dass ein Timeout in der regulären Ausdrucksmusterabgleichsmethode aufgetreten ist. Wenn möglich, sollten Informationen zum regulären Ausdrucksmuster, das aus der Pattern Input Eigenschaft verfügbar ist, und die Eingabe, die zu einer übermäßigen Rückverfolgung führte, protokolliert werden, damit das Problem untersucht werden kann und das reguläre Ausdrucksmuster geändert wurde. Timeouts aufgrund übermäßiger Backtrackings sind immer reproduzierbar.

  • Wenn die Timeoutergebnisse beim Festlegen des Timeout-Schwellenwerts zu niedrig sind, können Sie das Timeoutintervall erhöhen und den übereinstimmenden Vorgang wiederholen. Das aktuelle Timeoutintervall ist aus der MatchTimeout Eigenschaft verfügbar. Wenn eine RegexMatchTimeoutException Ausnahme ausgelöst wird, verwaltet das reguläre Ausdrucksmodul seinen Zustand, sodass zukünftige Aufrufe das gleiche Ergebnis zurückgeben, wie wenn die Ausnahme nicht auftritt. Das empfohlene Muster besteht darin, nach dem Auslösen der Ausnahme ein kurzes, zufälliges Zeitintervall zu warten, bevor die übereinstimmende Methode erneut aufgerufen wird. Dies kann mehrmals wiederholt werden. Die Anzahl der Wiederholungen sollte jedoch klein sein, wenn der Timeout durch übermäßige Rückverfolgung verursacht wird.

Das Beispiel im nächsten Abschnitt veranschaulicht beide Techniken zum Behandeln einer RegexMatchTimeoutException.

Konstruktoren

RegexMatchTimeoutException()

Initialisiert eine neue Instanz der RegexMatchTimeoutException-Klasse mit einer vom System generierten Meldung.

RegexMatchTimeoutException(SerializationInfo, StreamingContext)

Initialisiert eine neue Instanz der RegexMatchTimeoutException-Klasse mit serialisierten Daten.

RegexMatchTimeoutException(String)

Initialisiert eine neue Instanz der RegexMatchTimeoutException-Klasse mit der angegebenen Meldungszeichenfolge.

RegexMatchTimeoutException(String, Exception)

Initialisiert eine neue Instanz der RegexMatchTimeoutException-Klasse mit einer angegebenen Fehlermeldung und einem Verweis auf die innere Ausnahme, die diese Ausnahme ausgelöst hat.

RegexMatchTimeoutException(String, String, TimeSpan)

Initialisiert eine neue Instanz der RegexMatchTimeoutException-Klasse mit Informationen über das Muster eines regulären Ausdrucks, den Eingabetext und das Timeoutintervall.

Eigenschaften

Data

Ruft eine Auflistung von Schlüssel-Wert-Paaren ab, die zusätzliche benutzerdefinierte Informationen zur Ausnahme bereitstellen.

(Geerbt von Exception)
HelpLink

Ruft einen Link zur Hilfedatei ab, die dieser Ausnahme zugeordnet ist, oder legt einen Link fest.

(Geerbt von Exception)
HResult

Ruft HRESULT ab oder legt HRESULT fest. Dies ist ein codierter Wert, der einer bestimmten Ausnahme zugeordnet ist.

(Geerbt von Exception)
InnerException

Ruft die Exception-Instanz ab, die die aktuelle Ausnahme verursacht hat.

(Geerbt von Exception)
Input

Ruft den Eingabetext ab, den die Engine für reguläre Ausdrücke verarbeitet hat, als der Timeout aufgetreten ist.

MatchTimeout

Ruft das Timeoutintervall für eine Übereinstimmung für einen regulären Ausdruck ab.

Message

Ruft eine Meldung ab, mit der die aktuelle Ausnahme beschrieben wird.

(Geerbt von Exception)
Pattern

Ruft das Muster eines regulären Ausdrucks ab, das im entsprechenden Vorgang verwendet wurde, als das Timeout auftrat.

Source

Gibt den Namen der Anwendung oder des Objekts zurück, die bzw. das den Fehler verursacht hat, oder legt diesen fest.

(Geerbt von Exception)
StackTrace

Ruft eine Zeichenfolgendarstellung der unmittelbaren Frames in der Aufrufliste ab.

(Geerbt von Exception)
TargetSite

Ruft die Methode ab, die die aktuelle Ausnahme auslöst.

(Geerbt von Exception)

Methoden

Equals(Object)

Bestimmt, ob das angegebene Objekt gleich dem aktuellen Objekt ist.

(Geerbt von Object)
GetBaseException()

Gibt beim Überschreiben in einer abgeleiteten Klasse eine Exception zurück, die die Grundursache für eine oder mehrere nachfolgende Ausnahmen ist.

(Geerbt von Exception)
GetHashCode()

Fungiert als Standardhashfunktion.

(Geerbt von Object)
GetObjectData(SerializationInfo, StreamingContext)

Legt beim Überschreiben in einer abgeleiteten Klasse die SerializationInfo mit Informationen über die Ausnahme fest.

(Geerbt von Exception)
GetType()

Ruft den Laufzeittyp der aktuellen Instanz ab.

(Geerbt von Exception)
MemberwiseClone()

Erstellt eine flache Kopie des aktuellen Object.

(Geerbt von Object)
ToString()

Erstellt eine Zeichenfolgendarstellung der aktuellen Ausnahme und gibt diese zurück.

(Geerbt von Exception)

Ereignisse

SerializeObjectState
Veraltet.

Tritt auf, wenn eine Ausnahme serialisiert wird, um ein Ausnahmezustandsobjekt mit serialisierten Daten über die Ausnahme zu erstellen.

(Geerbt von Exception)

Explizite Schnittstellenimplementierungen

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Füllt ein SerializationInfo-Objekt mit den Daten, die zum Serialisieren eines RegexMatchTimeoutException-Objekts erforderlich sind.

Gilt für:

Siehe auch