Sdílet prostřednictvím


RegexMatchTimeoutException Třída

Definice

Výjimka, která je vyvolán, když doba provádění metody porovnávání vzorů regulárních výrazů překročí její časový limit interval.

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
Dědičnost
RegexMatchTimeoutException
Dědičnost
RegexMatchTimeoutException
Atributy
Implementuje

Příklady

Následující příklad znázorňuje dva možné přístupy ke zpracování RegexMatchTimeoutException výjimky. Konstanta, jejíž hodnota je dvě sekundy, definuje maximální interval časového limitu. Metoda Regex.IsMatch(String, String, RegexOptions, TimeSpan) je zpočátku volána s časovým limitem jedné sekundy. Každá RegexMatchTimeoutException výjimka způsobí, že interval časového limitu se zvýší o jednu sekundu a výsledkem je další volání Regex.IsMatch metody, pokud je aktuální interval časového limitu menší než maximální interval časového limitu. Pokud však aktuální interval časového limitu překročí maximální interval časového limitu, obslužná rutina výjimky zapíše informace do protokolu událostí a opustí zpracování regulárního výrazu.

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.

Poznámky

Přítomnost RegexMatchTimeoutException výjimky obecně označuje jednu z následujících podmínek:

  • Modul regulárních výrazů příliš ustupuje, protože se pokouší spárovat vstupní text se vzorem regulárního výrazu.

  • Interval časového limitu byl nastaven příliš nízký, zejména kvůli vysokému zatížení počítače.

Způsob, jakým obslužná rutina výjimky zpracovává výjimku, závisí na její příčině:

  • Pokud je vypršení časového limitu výsledkem nadměrného navracení, obslužná rutina výjimky by měla opustit pokus o shodu vstupu a informovat uživatele, že došlo k vypršení časového limitu v metodě porovnávání vzorů regulárního výrazu. Pokud je to možné, měly by být do protokolu zaznamenány informace o vzoru regulárního výrazu, který je k dispozici ve PatternInput vlastnosti, a vstup, který způsobil nadměrné navracení, aby bylo možné problém prozkoumat a změnit vzor regulárního výrazu. Časové limity způsobené nadměrným zpětným navracením jsou vždy reprodukovatelné.

  • Pokud je výsledkem vypršení časového limitu příliš nízká prahová hodnota časového limitu, můžete prodloužit interval časového limitu a zkusit znovu odpovídající operaci. Aktuální interval časového limitu je k dispozici ve MatchTimeout vlastnosti. Když dojde k výjimce RegexMatchTimeoutException , modul regulárních výrazů zachová svůj stav, takže jakékoli budoucí vyvolání vrátí stejný výsledek, jako kdyby k výjimce nedošlo. Doporučeným vzorem je počkat na krátký náhodný časový interval po vyvolání výjimky před opětovným voláním odpovídající metody. To se může několikrát opakovat. Počet opakování by ale měl být malý v případě, že je vypršení časového limitu způsobeno nadměrným zpětným navracením.

Příklad v další části znázorňuje obě techniky pro zpracování RegexMatchTimeoutException.

Konstruktory

RegexMatchTimeoutException()

Inicializuje novou instanci RegexMatchTimeoutException třídy se zprávou dodanou systémem.

RegexMatchTimeoutException(SerializationInfo, StreamingContext)

Inicializuje novou instanci třídy RegexMatchTimeoutException se serializovanými daty.

RegexMatchTimeoutException(String)

Inicializuje novou instanci RegexMatchTimeoutException třídy pomocí zadaného řetězce zprávy.

RegexMatchTimeoutException(String, Exception)

Inicializuje novou instanci RegexMatchTimeoutException třídy se zadanou chybovou zprávou a odkazem na vnitřní výjimku, která je příčinou této výjimky.

RegexMatchTimeoutException(String, String, TimeSpan)

Inicializuje novou instanci třídy s informacemi o vzoru regulárního RegexMatchTimeoutException výrazu, vstupním textu a intervalu časového limitu.

Vlastnosti

Data

Získá kolekci párů klíč/hodnota, které poskytují další uživatelem definované informace o výjimce.

(Zděděno od Exception)
HelpLink

Získá nebo nastaví odkaz na soubor nápovědy přidružené k této výjimce.

(Zděděno od Exception)
HResult

Získá nebo nastaví HRESULT, kódovanou číselnou hodnotu, která je přiřazena ke konkrétní výjimce.

(Zděděno od Exception)
InnerException

Exception Získá instanci, která způsobila aktuální výjimku.

(Zděděno od Exception)
Input

Získá vstupní text, který modul regulárních výrazů zpracovával, když došlo k vypršení časového limitu.

MatchTimeout

Získá interval časového limitu pro shodu regulárního výrazu.

Message

Získá zprávu, která popisuje aktuální výjimku.

(Zděděno od Exception)
Pattern

Získá vzor regulárního výrazu, který byl použit při porovnávání operace, když došlo k vypršení časového limitu.

Source

Získá nebo nastaví název aplikace nebo objektu, který způsobuje chybu.

(Zděděno od Exception)
StackTrace

Získá řetězcovou reprezentaci okamžitých rámců v zásobníku volání.

(Zděděno od Exception)
TargetSite

Získá metodu, která vyvolá aktuální výjimku.

(Zděděno od Exception)

Metody

Equals(Object)

Určí, zda se zadaný objekt rovná aktuálnímu objektu.

(Zděděno od Object)
GetBaseException()

Při přepsání v odvozené třídě vrátí Exception hodnotu, která je původní příčinou jedné nebo více následných výjimek.

(Zděděno od Exception)
GetHashCode()

Slouží jako výchozí hashovací funkce.

(Zděděno od Object)
GetObjectData(SerializationInfo, StreamingContext)

Při přepsání v odvozené třídě nastaví SerializationInfo s informacemi o výjimce.

(Zděděno od Exception)
GetType()

Získá typ modulu runtime aktuální instance.

(Zděděno od Exception)
MemberwiseClone()

Vytvoří mělkou kopii aktuálního Objectsouboru .

(Zděděno od Object)
ToString()

Vytvoří a vrátí řetězcovou reprezentaci aktuální výjimky.

(Zděděno od Exception)

Událost

SerializeObjectState
Zastaralé.

Nastane, když je výjimka serializována k vytvoření objektu stavu výjimky, který obsahuje serializovaná data o výjimce.

(Zděděno od Exception)

Explicitní implementace rozhraní

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Naplní SerializationInfo objekt daty potřebnými k serializaci objektu RegexMatchTimeoutException .

Platí pro

Viz také