Поделиться через


RegexMatchTimeoutException Класс

Определение

Исключение, которое выдается, если время выполнения метода сопоставления шаблонов регулярных выражений превышает интервал времени ожидания.

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
Наследование
RegexMatchTimeoutException
Наследование
RegexMatchTimeoutException
Атрибуты
Реализации

Примеры

В следующем примере показаны два возможных подхода к обработке RegexMatchTimeoutException исключения. Константа, значение которой составляет две секунды, определяет максимальный интервал времени ожидания. Метод Regex.IsMatch(String, String, RegexOptions, TimeSpan) изначально вызывается с интервалом времени ожидания в одну секунду. Каждое RegexMatchTimeoutException исключение приводит к увеличению интервала времени ожидания на одну секунду и приводит к другому вызову Regex.IsMatch метода, если текущий интервал времени ожидания меньше максимального интервала времени ожидания. Однако если текущий интервал времени ожидания превышает максимальное время ожидания, обработчик исключений записывает сведения в журнал событий и прекращает обработку регулярного выражения.

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.

Комментарии

Наличие RegexMatchTimeoutException исключения обычно указывает на одно из следующих условий:

  • Механизм регулярных выражений чрезмерно откативается, пытаясь сопоставить входной текст с шаблоном регулярного выражения.

  • Интервал времени ожидания слишком мал, особенно с учетом высокой нагрузки на компьютер.

Способ обработки исключения обработчиком исключений зависит от причины исключения:

  • Если время ожидания является результатом чрезмерного отслеживания, обработчик исключений должен отказаться от попытки сопоставления входных данных и сообщить пользователю, что в методе сопоставления шаблонов регулярных выражений произошло время ожидания. Если это возможно, необходимо регистрировать сведения о шаблоне регулярного выражения, доступном из Pattern свойства , и входных данных, вызвавших чрезмерный обратный поиск, которые доступны в Input свойстве , чтобы можно было исследовать проблему и изменить шаблон регулярного выражения. Время ожидания из-за чрезмерного возврата всегда воспроизводимо.

  • Если время ожидания является результатом слишком низкого порогового значения времени ожидания, можно увеличить интервал времени ожидания и повторить операцию сопоставления. Текущий интервал времени ожидания доступен в свойстве MatchTimeout . При возникновении RegexMatchTimeoutException исключения обработчик регулярных выражений сохраняет свое состояние, чтобы все последующие вызовы возвращали тот же результат, как если бы исключение не произошло. Рекомендуется дождаться краткого случайного интервала времени после создания исключения, прежде чем снова вызывать соответствующий метод. Это можно повторить несколько раз. Однако количество повторений должно быть небольшим на случай, если время ожидания вызвано чрезмерным возвратом.

В примере в следующем разделе показаны оба метода обработки RegexMatchTimeoutException.

Конструкторы

RegexMatchTimeoutException()

Инициализирует новый экземпляр класса RegexMatchTimeoutException, используя системное сообщение.

RegexMatchTimeoutException(SerializationInfo, StreamingContext)

Инициализирует новый экземпляр класса RegexMatchTimeoutException с сериализованными данными.

RegexMatchTimeoutException(String)

Инициализирует новый экземпляр класса RegexMatchTimeoutException с указанной строкой сообщения.

RegexMatchTimeoutException(String, Exception)

Инициализирует новый экземпляр класса RegexMatchTimeoutException указанным сообщением об ошибке и ссылкой на внутреннее исключение, вызвавшее данное исключение.

RegexMatchTimeoutException(String, String, TimeSpan)

Инициализирует новый экземпляр класса RegexMatchTimeoutException сведениями о шаблоне регулярного выражения, входном тексте и интервалом времени ожидания.

Свойства

Data

Возвращает коллекцию пар «ключ-значение», предоставляющую дополнительные сведения об исключении.

(Унаследовано от Exception)
HelpLink

Получает или задает ссылку на файл справки, связанный с этим исключением.

(Унаследовано от Exception)
HResult

Возвращает или задает HRESULT — кодированное числовое значение, присвоенное определенному исключению.

(Унаследовано от Exception)
InnerException

Возвращает экземпляр класса Exception, который вызвал текущее исключение.

(Унаследовано от Exception)
Input

Получает входной текст, который обрабатывался обработчиком регулярных выражений, когда истекло время ожидания.

MatchTimeout

Получает интервал времени для сравнения регулярного выражения.

Message

Возвращает сообщение, описывающее текущее исключение.

(Унаследовано от Exception)
Pattern

Получает шаблон регулярного выражения, который использовался в операции сравнения, когда истекло время ожидания.

Source

Возвращает или задает имя приложения или объекта, вызывавшего ошибку.

(Унаследовано от Exception)
StackTrace

Получает строковое представление непосредственных кадров в стеке вызова.

(Унаследовано от Exception)
TargetSite

Возвращает метод, создавший текущее исключение.

(Унаследовано от Exception)

Методы

Equals(Object)

Определяет, равен ли указанный объект текущему объекту.

(Унаследовано от Object)
GetBaseException()

При переопределении в производном классе возвращает исключение Exception, которое является первопричиной одного или нескольких последующих исключений.

(Унаследовано от Exception)
GetHashCode()

Служит хэш-функцией по умолчанию.

(Унаследовано от Object)
GetObjectData(SerializationInfo, StreamingContext)

При переопределении в производном классе задает объект SerializationInfo со сведениями об исключении.

(Унаследовано от Exception)
GetType()

Возвращает тип среды выполнения текущего экземпляра.

(Унаследовано от Exception)
MemberwiseClone()

Создает неполную копию текущего объекта Object.

(Унаследовано от Object)
ToString()

Создает и возвращает строковое представление текущего исключения.

(Унаследовано от Exception)

События

SerializeObjectState
Устаревшие..

Возникает, когда исключение сериализовано для создания объекта состояния исключения, содержащего сериализованные данные об исключении.

(Унаследовано от Exception)

Явные реализации интерфейса

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Заполняет объект SerializationInfo данными, необходимыми для сериализации объекта RegexMatchTimeoutException.

Применяется к

См. также раздел