RegexMatchTimeoutException Třída
Definice
Důležité
Některé informace platí pro předběžně vydaný produkt, který se může zásadně změnit, než ho výrobce nebo autor vydá. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
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
- Dědičnost
- 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 . |