次の方法で共有


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
属性
実装

次の例は、例外を処理するための 2 つの考えられる方法を RegexMatchTimeoutException 示しています。 値が 2 秒の定数は、最大タイムアウト間隔を定義します。 メソッドは Regex.IsMatch(String, String, RegexOptions, TimeSpan) 、最初は 1 秒のタイムアウト間隔で呼び出されます。 各 RegexMatchTimeoutException 例外により、タイムアウト間隔が 1 秒増加し、現在のタイムアウト間隔が最大タイムアウト間隔より小さい場合は、 メソッドの別の呼び出し 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()

派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の根本原因である Exception を返します。

(継承元 Exception)
GetHashCode()

既定のハッシュ関数として機能します。

(継承元 Object)
GetObjectData(SerializationInfo, StreamingContext)

派生クラスでオーバーライドされた場合は、その例外に関する情報を使用して SerializationInfo を設定します。

(継承元 Exception)
GetType()

現在のインスタンスのランタイム型を取得します。

(継承元 Exception)
MemberwiseClone()

現在の Object の簡易コピーを作成します。

(継承元 Object)
ToString()

現在の例外の文字列形式を作成して返します。

(継承元 Exception)

イベント

SerializeObjectState
古い.

例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。

(継承元 Exception)

明示的なインターフェイスの実装

ISerializable.GetObjectData(SerializationInfo, StreamingContext)

SerializationInfo オブジェクトに、RegexMatchTimeoutException オブジェクトをシリアル化するために必要なデータを設定します。

適用対象

こちらもご覧ください