RegexMatchTimeoutException Clase

Definición

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
RegexMatchTimeoutException
Herencia
RegexMatchTimeoutException
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.

Se aplica a

Consulte también