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.The exception that is thrown when the execution time of a regular expression pattern-matching method exceeds its time-out 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
Public Class RegexMatchTimeoutException
Inherits TimeoutException
Herencia
RegexMatchTimeoutException
Herencia
RegexMatchTimeoutException
Atributos
Implementaciones

Ejemplos

En el ejemplo siguiente se muestran dos enfoques posibles para controlar la excepción RegexMatchTimeoutException.The following example illustrates two possible approaches to handling the RegexMatchTimeoutException exception. Una constante cuyo valor es dos segundos define el intervalo de tiempo de espera máximo.A constant whose value is two seconds defines the maximum time-out interval. Se llama inicialmente al método Regex.IsMatch(String, String, RegexOptions, TimeSpan) con un intervalo de tiempo de espera de un segundo.The Regex.IsMatch(String, String, RegexOptions, TimeSpan) method is initially called with a time-out interval of one second. Cada excepción RegexMatchTimeoutException hace que el intervalo de tiempo de espera aumente en un segundo y produce otra llamada al método Regex.IsMatch si el intervalo de tiempo de espera actual es menor que el intervalo de tiempo de espera máximo.Each RegexMatchTimeoutException exception causes the time-out interval to be increased by one second and results in another call to the Regex.IsMatch method if the current time-out interval is less than the maximum time-out interval. Sin embargo, si el intervalo de tiempo de espera actual supera el intervalo de tiempo de espera máximo, el controlador de excepción escribe información en el registro de eventos y abandona el procesamiento de la expresión regular.However, if the current time-out interval exceeds the maximum time-out interval, the exception handler writes information to the event log and abandons the processing of the regular expression.

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 excepción RegexMatchTimeoutException generalmente indica una de las siguientes condiciones:The presence of a RegexMatchTimeoutException exception generally indicates one of the following conditions:

  • El motor de expresiones regulares realiza un retroceso excesivo cuando intenta hacer coincidir el texto de entrada con el patrón de expresión regular.The regular expression engine is backtracking excessively as it attempts to match the input text to the regular expression pattern.

  • El intervalo de tiempo de espera se ha establecido demasiado bajo, especialmente si la carga de la máquina es alta.The time-out interval has been set too low, especially given high machine load.

La forma en que un controlador de excepciones controla una excepción depende de la causa de la excepción:The way in which an exception handler handles an exception depends on the cause of the exception:

  • Si el tiempo de espera resulta de un retroceso excesivo, el controlador de excepciones debe abandonar el intento de coincidir con la entrada e informar al usuario de que se ha producido un tiempo de espera en el método de coincidencia de patrones de expresión regular.If the time-out results from excessive backtracking, your exception handler should abandon the attempt to match the input and inform the user that a time-out has occurred in the regular expression pattern-matching method. Si es posible, la información sobre el patrón de expresión regular, que está disponible en la propiedad Pattern, y la entrada que causó un retroceso excesivo, que está disponible en la propiedad Input, se debe registrar para que se pueda investigar el problema y se modifique el patrón de expresión regular.If possible, information about the regular expression pattern, which is available from the Pattern property, and the input that caused excessive backtracking, which is available from the Input property, should be logged so that the issue can be investigated and the regular expression pattern modified. Los tiempos de espera debidos a un retroceso excesivo siempre se pueden reproducir.Time-outs due to excessive backtracking are always reproducible.

  • Si el tiempo de espera resultante para establecer el umbral de tiempo de espera es demasiado bajo, puede aumentar el intervalo de tiempo de espera y reintentar la operación de búsqueda de coincidencias.If the time-out results from setting the time-out threshold too low, you can increase the time-out interval and retry the matching operation. El intervalo de tiempo de espera actual está disponible en la propiedad MatchTimeout.The current time-out interval is available from the MatchTimeout property. Cuando se produce una excepción de RegexMatchTimeoutException, el motor de expresiones regulares mantiene su estado para que las invocaciones futuras devuelvan el mismo resultado, como si no se hubiera producido la excepción.When a RegexMatchTimeoutException exception is thrown, the regular expression engine maintains its state so that any future invocations return the same result, as if the exception did not occur. El patrón recomendado es esperar un intervalo de tiempo aleatorio breve después de que se produzca la excepción antes de volver a llamar al método coincidente.The recommended pattern is to wait for a brief, random time interval after the exception is thrown before calling the matching method again. Esto se puede repetir varias veces.This can be repeated several times. 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.However, the number of repetitions should be small in case the time-out is caused by excessive backtracking.

En el ejemplo de la siguiente sección se muestran las dos técnicas para controlar una RegexMatchTimeoutException.The example in the next section illustrates both techniques for handling a RegexMatchTimeoutException.

Constructores

RegexMatchTimeoutException()

Inicializa una nueva instancia de la clase RegexMatchTimeoutException con un mensaje proporcionado por el sistema.Initializes a new instance of the RegexMatchTimeoutException class with a system-supplied message.

RegexMatchTimeoutException(SerializationInfo, StreamingContext)

Inicializa una nueva instancia de la clase RegexMatchTimeoutException con datos serializados.Initializes a new instance of the RegexMatchTimeoutException class with serialized data.

RegexMatchTimeoutException(String)

Inicializa una nueva instancia de la clase RegexMatchTimeoutException con la cadena de mensaje especificada.Initializes a new instance of the RegexMatchTimeoutException class with the specified message string.

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.Initializes a new instance of the RegexMatchTimeoutException class with a specified error message and a reference to the inner exception that is the cause of this exception.

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.Initializes a new instance of the RegexMatchTimeoutException class with information about the regular expression pattern, the input text, and the time-out interval.

Propiedades

Data

Obtiene una colección de pares clave-valor que proporcionan más información definida por el usuario sobre la excepción.Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Heredado de Exception)
HelpLink

Obtiene o establece un vínculo al archivo de ayuda asociado a esta excepción.Gets or sets a link to the help file associated with this exception.

(Heredado de Exception)
HResult

Obtiene o establece HRESULT, un valor numérico codificado que se asigna a una excepción específica.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Heredado de Exception)
InnerException

Obtiene la instancia Exception que produjo la excepción actual.Gets the Exception instance that caused the current exception.

(Heredado de Exception)
Input

Obtiene el texto de entrada que el motor de expresiones regulares estaba procesando cuando se agotó el tiempo de espera.Gets the input text that the regular expression engine was processing when the time-out occurred.

MatchTimeout

Obtiene el intervalo de tiempo de espera para una coincidencia de expresión regular.Gets the time-out interval for a regular expression match.

Message

Obtiene un mensaje que describe la excepción actual.Gets a message that describes the current exception.

(Heredado de Exception)
Pattern

Obtiene el modelo de expresión regular usado en la operación coincidente cuando se agotó el tiempo de espera.Gets the regular expression pattern that was used in the matching operation when the time-out occurred.

Source

Devuelve o establece el nombre de la aplicación o del objeto que generó el error.Gets or sets the name of the application or the object that causes the error.

(Heredado de Exception)
StackTrace

Obtiene una representación de cadena de los marcos inmediatos en la pila de llamadas.Gets a string representation of the immediate frames on the call stack.

(Heredado de Exception)
TargetSite

Obtiene el método que produjo la excepción actual.Gets the method that throws the current exception.

(Heredado de Exception)

Métodos

Equals(Object)

Determina si el objeto especificado es igual que el objeto actual.Determines whether the specified object is equal to the current object.

(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.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Heredado de Exception)
GetHashCode()

Sirve como función hash predeterminada.Serves as the default hash function.

(Heredado de Object)
GetObjectData(SerializationInfo, StreamingContext)

Cuando se invalida en una clase derivada, establece SerializationInfo con información sobre la excepción.When overridden in a derived class, sets the SerializationInfo with information about the exception.

(Heredado de Exception)
GetType()

Obtiene el tipo de tiempo de ejecución de la instancia actual.Gets the runtime type of the current instance.

(Heredado de Exception)
MemberwiseClone()

Crea una copia superficial del Object actual.Creates a shallow copy of the current Object.

(Heredado de Object)
ToString()

Crea y devuelve una representación de cadena de la excepción actual.Creates and returns a string representation of the current exception.

(Heredado de Exception)

Eventos

SerializeObjectState

Ocurre cuando una excepción se serializa para crear un objeto de estado de excepción que contenga datos serializados sobre la excepción.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(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.Populates a SerializationInfo object with the data needed to serialize a RegexMatchTimeoutException object.

Se aplica a

Consulte también: