RegexMatchTimeoutException Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Wyjątek zgłaszany, gdy czas wykonywania metody dopasowania wzorca wyrażenia regularnego przekracza interwał limitu czasu.
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
- Dziedziczenie
- Dziedziczenie
- Atrybuty
- Implementuje
Przykłady
W poniższym przykładzie przedstawiono dwa możliwe podejścia do obsługi wyjątku RegexMatchTimeoutException . Stała, której wartość wynosi dwie sekundy, definiuje maksymalny interwał limitu czasu. Metoda Regex.IsMatch(String, String, RegexOptions, TimeSpan) jest początkowo wywoływana z interwałem limitu czasu jednej sekundy. Każdy RegexMatchTimeoutException wyjątek powoduje zwiększenie interwału przekroczenia limitu czasu o jedną sekundę i powoduje wywołanie innej Regex.IsMatch metody, jeśli bieżący interwał limitu czasu jest krótszy niż maksymalny interwał limitu czasu. Jeśli jednak bieżący interwał limitu czasu przekracza maksymalny interwał limitu czasu, program obsługi wyjątków zapisuje informacje w dzienniku zdarzeń i rezygnuje z przetwarzania wyrażenia regularnego.
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.
Uwagi
Obecność wyjątku RegexMatchTimeoutException zazwyczaj wskazuje jeden z następujących warunków:
Aparat wyrażeń regularnych jest nadmiernie wycofywania, ponieważ próbuje dopasować tekst wejściowy do wzorca wyrażenia regularnego.
Interwał limitu czasu został ustawiony zbyt nisko, zwłaszcza biorąc pod uwagę duże obciążenie maszyny.
Sposób, w jaki program obsługi wyjątków obsługuje wyjątek, zależy od przyczyny wyjątku:
Jeśli przekroczenie limitu czasu wynika z nadmiernego wycofywania, procedura obsługi wyjątków powinna porzucić próbę dopasowania danych wejściowych i poinformować użytkownika, że upłynął limit czasu w metodzie dopasowywania wyrażeń regularnych. Jeśli to możliwe, informacje o wzorzec wyrażenia regularnego, który jest dostępny z Pattern właściwości, oraz dane wejściowe, które spowodowały nadmierne wycofywanie, które jest dostępne z Input właściwości, powinny być rejestrowane, aby można było zbadać problem i zmodyfikować wzorzec wyrażenia regularnego. Przekroczenia limitu czasu z powodu nadmiernego wycofywania są zawsze odtwarzalne.
Jeśli przekroczenie limitu czasu wynika z ustawienia progu limitu czasu jest zbyt niskie, możesz zwiększyć interwał limitu czasu i ponowić próbę wykonania zgodnej operacji. Bieżący interwał limitu czasu jest dostępny z MatchTimeout właściwości . RegexMatchTimeoutException Gdy zostanie zgłoszony wyjątek, aparat wyrażeń regularnych zachowuje swój stan, tak aby wszelkie przyszłe wywołania zwróciły ten sam wynik, tak jak gdyby wyjątek nie wystąpił. Zalecanym wzorcem jest oczekiwanie na krótki, losowy interwał czasu po wystąpieniu wyjątku przed ponownym wywołaniem zgodnej metody. Można to powtórzyć kilka razy. Jednak liczba powtórzeń powinna być mała w przypadku przekroczenia limitu czasu spowodowanego nadmiernym wycofywaniem.
W przykładzie w następnej sekcji przedstawiono obie techniki obsługi .RegexMatchTimeoutException
Konstruktory
RegexMatchTimeoutException() |
Inicjuje RegexMatchTimeoutException nowe wystąpienie klasy z komunikatem dostarczonym przez system. |
RegexMatchTimeoutException(SerializationInfo, StreamingContext) |
Inicjuje nowe wystąpienie klasy RegexMatchTimeoutException z zserializowanymi danymi. |
RegexMatchTimeoutException(String) |
Inicjuje RegexMatchTimeoutException nowe wystąpienie klasy z określonym ciągiem komunikatu. |
RegexMatchTimeoutException(String, Exception) |
Inicjuje nowe wystąpienie RegexMatchTimeoutException klasy z określonym komunikatem o błędzie i odwołaniem do wewnętrznego wyjątku, który jest przyczyną tego wyjątku. |
RegexMatchTimeoutException(String, String, TimeSpan) |
Inicjuje nowe wystąpienie klasy z informacjami na temat wzorca wyrażenia regularnego RegexMatchTimeoutException , tekstu wejściowego i interwału limitu czasu. |
Właściwości
Data |
Pobiera kolekcję par klucz/wartość, które zapewniają dodatkowe informacje zdefiniowane przez użytkownika dotyczące wyjątku. (Odziedziczone po Exception) |
HelpLink |
Pobiera lub ustawia link do pliku pomocy skojarzonego z tym wyjątkiem. (Odziedziczone po Exception) |
HResult |
Pobiera lub ustawia HRESULT, zakodowaną wartość liczbową przypisaną do określonego wyjątku. (Odziedziczone po Exception) |
InnerException |
Exception Pobiera wystąpienie, które spowodowało bieżący wyjątek. (Odziedziczone po Exception) |
Input |
Pobiera tekst wejściowy, który aparat wyrażeń regularnych przetwarzał, gdy wystąpił limit czasu. |
MatchTimeout |
Pobiera interwał limitu czasu dla dopasowania wyrażenia regularnego. |
Message |
Pobiera komunikat opisujący bieżący wyjątek. (Odziedziczone po Exception) |
Pattern |
Pobiera wzorzec wyrażenia regularnego, który został użyty w pasującej operacji, gdy wystąpił limit czasu. |
Source |
Pobiera lub ustawia nazwę aplikacji lub obiektu, który powoduje błąd. (Odziedziczone po Exception) |
StackTrace |
Pobiera reprezentację ciągu natychmiastowych ramek w stosie wywołań. (Odziedziczone po Exception) |
TargetSite |
Pobiera metodę, która zgłasza bieżący wyjątek. (Odziedziczone po Exception) |
Metody
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
GetBaseException() |
W przypadku zastąpienia w klasie pochodnej zwraca Exception główną przyczynę co najmniej jednego kolejnego wyjątku. (Odziedziczone po Exception) |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Po przesłonięciu w klasie pochodnej ustawia SerializationInfo wartość z informacjami o wyjątku. (Odziedziczone po Exception) |
GetType() |
Pobiera typ środowiska uruchomieniowego bieżącego wystąpienia. (Odziedziczone po Exception) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
ToString() |
Tworzy i zwraca reprezentację ciągu bieżącego wyjątku. (Odziedziczone po Exception) |
Zdarzenia
SerializeObjectState |
Przestarzałe.
Występuje, gdy wyjątek jest serializowany w celu utworzenia obiektu stanu wyjątku zawierającego serializowane dane o wyjątku. (Odziedziczone po Exception) |
Jawne implementacje interfejsu
ISerializable.GetObjectData(SerializationInfo, StreamingContext) |
SerializationInfo Wypełnia obiekt danymi wymaganymi do serializacji RegexMatchTimeoutException obiektu. |