RegexMatchTimeoutException Clase
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Excepción que se produce cuando el tiempo de ejecución de un método de coincidencia de patrón de expresión regular supera su intervalo de tiempo de espera.
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
- Herencia
- Herencia
- Atributos
- Implementaciones
Ejemplos
En el ejemplo siguiente se muestran dos enfoques posibles para controlar la RegexMatchTimeoutException excepción. Constante cuyo valor es de dos segundos define el intervalo de tiempo de espera máximo. Inicialmente Regex.IsMatch(String, String, RegexOptions, TimeSpan) , se llama al método con un intervalo de tiempo de espera de un segundo. Cada RegexMatchTimeoutException excepción hace que el intervalo de tiempo de espera aumente en un segundo y da como resultado otra llamada al Regex.IsMatch método si el intervalo de tiempo de espera actual es menor que el intervalo de tiempo de espera máximo. Sin embargo, si el intervalo de tiempo de espera actual supera el intervalo de tiempo de espera máximo, el controlador de excepciones escribe información en el registro de eventos y abandona el procesamiento de la expresión regular.
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.
Comentarios
La presencia de una RegexMatchTimeoutException excepción suele indicar una de las condiciones siguientes:
El motor de expresiones regulares retrocede excesivamente, ya que intenta hacer coincidir el texto de entrada con el patrón de expresión regular.
El intervalo de tiempo de espera se ha establecido demasiado bajo, especialmente dada una carga alta de la máquina.
La forma en que un controlador de excepciones controla una excepción depende de la causa de la excepción:
Si el tiempo de espera resulta de un retroceso excesivo, el controlador de excepciones debe abandonar el intento de hacer coincidir la entrada e informar al usuario de que se ha agotado el tiempo de espera en el método de coincidencia de patrones de expresión regular. Si es posible, se debe registrar información sobre el patrón de expresión regular, que está disponible en la Pattern propiedad y la entrada que provocó un retroceso excesivo, que está disponible en la Input propiedad , para que se pueda investigar el problema y modificar el patrón de expresión regular. Los tiempos de espera debidos a un retroceso excesivo siempre son reproducibles.
Si el tiempo de espera se produce al establecer el umbral de tiempo de espera demasiado bajo, puede aumentar el intervalo de tiempo de espera y volver a intentar la operación coincidente. El intervalo de tiempo de espera actual está disponible en la MatchTimeout propiedad . Cuando se produce una RegexMatchTimeoutException excepción, el motor de expresiones regulares mantiene su estado para que las invocaciones futuras devuelvan el mismo resultado, como si no se produjera la excepción. El patrón recomendado es esperar un breve intervalo de tiempo aleatorio después de que se produzca la excepción antes de volver a llamar al método coincidente. Esto se puede repetir varias veces. Sin embargo, el número de repeticiones debe ser pequeño en caso de que el tiempo de espera se deba a un retroceso excesivo.
En el ejemplo de la sección siguiente se muestran ambas técnicas para controlar .RegexMatchTimeoutException
Constructores
RegexMatchTimeoutException() |
Inicializa una nueva instancia de la clase RegexMatchTimeoutException con un mensaje proporcionado por el sistema. |
RegexMatchTimeoutException(SerializationInfo, StreamingContext) |
Inicializa una nueva instancia de la clase RegexMatchTimeoutException con datos serializados. |
RegexMatchTimeoutException(String) |
Inicializa una nueva instancia de la clase RegexMatchTimeoutException con la cadena de mensaje especificada. |
RegexMatchTimeoutException(String, Exception) |
Inicializa una nueva instancia de la clase RegexMatchTimeoutException con el mensaje de error especificado y una referencia a la excepción interna que representa la causa de esta excepción. |
RegexMatchTimeoutException(String, String, TimeSpan) |
Inicializa una nueva instancia de la clase RegexMatchTimeoutException con información sobre el modelo de expresión regular, el texto de entrada y el intervalo de tiempo de espera. |
Propiedades
Data |
Obtiene una colección de pares clave/valor que proporciona información definida por el usuario adicional sobre la excepción. (Heredado de Exception) |
HelpLink |
Obtiene o establece un vínculo al archivo de ayuda asociado a esta excepción. (Heredado de Exception) |
HResult |
Obtiene o establece HRESULT, un valor numérico codificado que se asigna a una excepción específica. (Heredado de Exception) |
InnerException |
Obtiene la instancia Exception que produjo la excepción actual. (Heredado de Exception) |
Input |
Obtiene el texto de entrada que el motor de expresiones regulares estaba procesando cuando se agotó el tiempo de espera. |
MatchTimeout |
Obtiene el intervalo de tiempo de espera para una coincidencia de expresión regular. |
Message |
Obtiene un mensaje que describe la excepción actual. (Heredado de Exception) |
Pattern |
Obtiene el modelo de expresión regular usado en la operación coincidente cuando se agotó el tiempo de espera. |
Source |
Devuelve o establece el nombre de la aplicación o del objeto que generó el error. (Heredado de Exception) |
StackTrace |
Obtiene una representación de cadena de los marcos inmediatos en la pila de llamadas. (Heredado de Exception) |
TargetSite |
Obtiene el método que produjo la excepción actual. (Heredado de Exception) |
Métodos
Equals(Object) |
Determina si el objeto especificado es igual que el objeto actual. (Heredado de Object) |
GetBaseException() |
Cuando se invalida en una clase derivada, devuelve la clase Exception que representa la causa principal de una o más excepciones posteriores. (Heredado de Exception) |
GetHashCode() |
Sirve como la función hash predeterminada. (Heredado de Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Cuando se invalida en una clase derivada, establece SerializationInfo con información sobre la excepción. (Heredado de Exception) |
GetType() |
Obtiene el tipo de tiempo de ejecución de la instancia actual. (Heredado de Exception) |
MemberwiseClone() |
Crea una copia superficial del Object actual. (Heredado de Object) |
ToString() |
Crea y devuelve una representación de cadena de la excepción actual. (Heredado de Exception) |
Eventos
SerializeObjectState |
Obsoletos.
Ocurre cuando una excepción se serializa para crear un objeto de estado de excepción que contenga datos serializados sobre la excepción. (Heredado de Exception) |
Implementaciones de interfaz explícitas
ISerializable.GetObjectData(SerializationInfo, StreamingContext) |
Rellena un objeto SerializationInfo con los datos necesarios para serializar un objeto RegexMatchTimeoutException. |