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

Das folgende Beispiel veranschaulicht zwei mögliche Ansätze für die Behandlung der RegexMatchTimeoutException Ausnahme. 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 führt zu einem weiteren Aufruf der Regex.IsMatch -Methode, 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 beendet 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

Das Vorhandensein einer RegexMatchTimeoutException Ausnahme weist im Allgemeinen auf eine der folgenden Bedingungen hin:

  • Die Engine für reguläre Ausdrücke führt eine übermäßige Rückverfolgung durch, da sie versucht, den Eingabetext mit dem Muster für reguläre Ausdrücke abzugleichen.

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

Wie ein Ausnahmehandler eine Ausnahme behandelt, hängt von der Ursache der Ausnahme ab:

  • Wenn das Timeout aufgrund einer übermäßigen Rückverfolgung resultiert, sollte Ihr Ausnahmehandler den Versuch aufgeben, die Eingabe abzugleichen, und den Benutzer darüber informieren, dass in der Methode zum Musterabgleich mit regulären Ausdrücken ein Timeout aufgetreten ist. Wenn möglich, sollten Informationen zum Muster für reguläre Ausdrücke, das über die Pattern -Eigenschaft verfügbar ist, und die Eingabe protokolliert werden, die übermäßiges Backtracking verursacht hat, die über die Input -Eigenschaft verfügbar ist, damit das Problem untersucht und das Reguläre Ausdrucksmuster geändert werden kann. Timeouts aufgrund übermäßiger Rückverfolgung sind immer reproduzierbar.

  • Wenn das Timeout durch das Festlegen des Timeoutschwellenwerts zu niedrig ist, können Sie das Timeoutintervall erhöhen und den Abgleichsvorgang wiederholen. Das aktuelle Timeoutintervall ist über die MatchTimeout -Eigenschaft verfügbar. Wenn eine RegexMatchTimeoutException Ausnahme ausgelöst wird, behält die Engine für reguläre Ausdrücke ihren Zustand bei, sodass alle zukünftigen Aufrufe das gleiche Ergebnis zurückgeben, als ob die Ausnahme nicht aufgetreten wäre. Das empfohlene Muster besteht darin, ein kurzes, zufälliges Zeitintervall zu warten, nachdem die Ausnahme ausgelöst wurde, bevor die übereinstimmende Methode erneut aufgerufen wird. Dies kann mehrmals wiederholt werden. Die Anzahl der Wiederholungen sollte jedoch gering sein, wenn das Timeout durch übermäßiges Backtracking verursacht wird.

Das Beispiel im nächsten Abschnitt veranschaulicht beide Techniken zum Behandeln eines 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:

Weitere Informationen