RegexMatchTimeoutException Třída

Definice

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

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 ukazuje 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) se zpočátku volá s časovým limitem jedné sekundy. Každá RegexMatchTimeoutException výjimka způsobí zvýšení intervalu časového limitu 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í časový limit, 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

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

  • Modul regulárních výrazů provádí nadměrné navracení, protože se pokouší spárovat vstupní text se vzorem regulárního výrazu.

  • Časový limit byl nastaven příliš nízký, zejména při vysokém zatížení počítače.

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

  • Pokud vypršení časového limitu způsobí nadměrné navracení, obslužná rutina výjimky by měla opustit pokus o shodu se vstupem 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é, informace o vzoru regulárního výrazu, který je k dispozici z Pattern vlastnosti, a vstup, který způsobil nadměrné navracení, které je k dispozici z Input vlastnosti, by se měly protokolovat, aby bylo možné problém prozkoumat a vzor regulárního výrazu upravit. Časové limity způsobené nadměrným navracením jsou vždy reprodukovatelné.

  • Pokud je výsledkem vypršení časového limitu nastavení příliš nízké prahové hodnoty časového limitu, můžete prodloužit časový limit a zkusit opakovat odpovídající operaci. Aktuální časový limit je k dispozici ve MatchTimeout vlastnosti. Když dojde k RegexMatchTimeoutException vyvolání výjimky, modul regulárních výrazů zachová svůj stav tak, aby jakékoli budoucí vyvolání vrátilo 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 opakovat několikrát. V případě vypršení časového limitu by však měl být počet opakování malý v případě nadměrného navracení.

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

Konstruktory

Name Description
RegexMatchTimeoutException()

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

RegexMatchTimeoutException(SerializationInfo, StreamingContext)
Zastaralé.

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

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.

RegexMatchTimeoutException(String)

Inicializuje novou instanci RegexMatchTimeoutException třídy se zadaným řetězcem zprávy.

Vlastnosti

Name Description
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á časový limit 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 v odpovídající operaci, 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ězcové znázornění 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

Name Description
Equals(Object)

Určuje, zda je zadaný objekt roven aktuálnímu objektu.

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

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

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

Slouží jako výchozí funkce hash.

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

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 Object.

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

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

(Zděděno od Exception)

Událost

Name Description
SerializeObjectState
Zastaralé.

Nastane, když je výjimka serializována vytvořit objekt stavu výjimky, který obsahuje serializovaná data o výjimce.

(Zděděno od Exception)

Explicitní implementace rozhraní

Name Description
ISerializable.GetObjectData(SerializationInfo, StreamingContext)

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

Platí pro

Viz také