RegexMatchTimeoutException Klasa

Definicja

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
RegexMatchTimeoutException
Dziedziczenie
RegexMatchTimeoutException
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.

Dotyczy

Zobacz też