RegexMatchTimeoutException Třída

Definice

Výjimka, která se vyvolá, když doba provádění metody porovnávání vzorů regulárního výrazu 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 k zpracování RegexMatchTimeoutException výjimky. Konstanta, jejíž hodnota je dvě sekundy, definuje maximální časový limit. Metoda Regex.IsMatch(String, String, RegexOptions, TimeSpan) se zpočátku volá s časovým limitem jedné sekundy. Každá RegexMatchTimeoutException výjimka způsobí, že se interval časového limitu zvýší o jednu sekundu a způsobí další volání Regex.IsMatch metody, pokud je aktuální interval časového limitu menší než maximální časový limit. Pokud ale 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

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

  • Modul regulárníchvýrazchm výrazům se příliš při pokusu o shodu se vstupním textem se vzorem regulárního výrazu.

  • Interval časového limitu je 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í, měla by obslužná rutina výjimky 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ích výrazů. 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 vypršení časového limitu způsobí příliš nízkou prahovou hodnotu časového limitu, můžete interval časového limitu prodloužit a zkusit operaci shodovat znovu. Aktuální interval časového limitu MatchTimeout je k dispozici ve vlastnosti. RegexMatchTimeoutException Při vyvolání výjimky modul regulárních výrazů udržuje svůj stav, 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. Počet opakování by ale měl být malý v případě, že vypršení časového limitu způsobuje nadměrné navracení.

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 zadanou systémem.

RegexMatchTimeoutException(SerializationInfo, StreamingContext)

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

RegexMatchTimeoutException(String)

Inicializuje novou instanci RegexMatchTimeoutException třídy se zadaným řetězcem 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 RegexMatchTimeoutException třídy s informacemi o vzoru regulárního 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 přiřazenou 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

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 hlavní 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)

Při přepsání v odvozené třídě nastaví s SerializationInfo 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ří použádnou kopii aktuálního souboru 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

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)

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

Platí pro

Viz také