RegexMatchTimeoutException Klasse
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
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
- Vererbung
- 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. |