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


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 исключения обычно указывает на одно из следующих условий:

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

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

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

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

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

Пример в следующем разделе иллюстрирует оба метода обработки RegexMatchTimeoutException.

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

Имя Описание
RegexMatchTimeoutException()

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

RegexMatchTimeoutException(SerializationInfo, StreamingContext)
Устаревшие..

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

RegexMatchTimeoutException(String, Exception)

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

RegexMatchTimeoutException(String, String, TimeSpan)

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

RegexMatchTimeoutException(String)

Инициализирует новый экземпляр 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 объекта.

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

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