RegexMatchTimeoutException クラス
定義
重要
一部の情報は、リリース前に大きく変更される可能性があるプレリリースされた製品に関するものです。 Microsoft は、ここに記載されている情報について、明示または黙示を問わず、一切保証しません。
正規表現パターン マッチング メソッドの実行時間が、タイムアウト間隔を超えた場合にスローされる例外。
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
- 継承
- 継承
- 属性
- 実装
例
次の例は、例外を処理するための 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 オブジェクトをシリアル化するために必要なデータを設定します。 |