Bagikan melalui


RegexMatchTimeoutException Kelas

Definisi

Pengecualian yang dilemparkan ketika waktu eksekusi metode pencocokan pola ekspresi reguler melebihi interval waktu habisnya.

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
Warisan
RegexMatchTimeoutException
Warisan
RegexMatchTimeoutException
Atribut
Penerapan

Contoh

Contoh berikut mengilustrasikan dua pendekatan yang mungkin untuk menangani RegexMatchTimeoutException pengecualian. Konstanta yang nilainya adalah dua detik menentukan interval batas waktu maksimum. Metode Regex.IsMatch(String, String, RegexOptions, TimeSpan) ini awalnya dipanggil dengan interval waktu habis satu detik. Setiap RegexMatchTimeoutException pengecualian menyebabkan interval waktu habis ditingkatkan satu detik dan menghasilkan panggilan lain ke Regex.IsMatch metode jika interval waktu habis saat ini kurang dari interval waktu habis maksimum. Namun, jika interval waktu habis saat ini melebihi interval waktu habis maksimum, handler pengecualian menulis informasi ke log peristiwa dan meninggalkan pemrosesan ekspresi reguler.

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.

Keterangan

Kehadiran RegexMatchTimeoutException pengecualian umumnya menunjukkan salah satu kondisi berikut:

  • Mesin ekspresi reguler melakukan backtracking secara berlebihan saat mencoba mencocokkan teks input dengan pola ekspresi reguler.

  • Interval waktu habis telah diatur terlalu rendah, terutama mengingat beban mesin tinggi.

Cara penangan pengecualian menangani pengecualian tergantung pada penyebab pengecualian:

  • Jika waktu habis dihasilkan dari backtracking yang berlebihan, handler pengecualian Anda harus meninggalkan upaya untuk mencocokkan input dan memberi tahu pengguna bahwa waktu habis telah terjadi dalam metode pencocokan pola ekspresi reguler. Jika memungkinkan, informasi tentang pola ekspresi reguler, yang tersedia dari Pattern properti, dan input yang menyebabkan backtracking yang berlebihan, yang tersedia dari Input properti, harus dicatat sehingga masalah dapat diselidiki dan pola ekspresi reguler dimodifikasi. Waktu habis karena backtracking yang berlebihan selalu dapat direproduksi.

  • Jika waktu habis menghasilkan pengaturan ambang batas waktu habis terlalu rendah, Anda dapat meningkatkan interval waktu habis dan mencoba kembali operasi yang cocok. Interval waktu habis saat ini tersedia dari MatchTimeout properti . RegexMatchTimeoutException Ketika pengecualian dilemparkan, mesin ekspresi reguler mempertahankan statusnya sehingga pemanggilan di masa mendatang mengembalikan hasil yang sama, seolah-olah pengecualian tidak terjadi. Pola yang direkomendasikan adalah menunggu interval waktu acak singkat setelah pengecualian dilemparkan sebelum memanggil metode pencocokan lagi. Ini dapat diulang beberapa kali. Namun, jumlah pengulangan harus kecil jika waktu habis disebabkan oleh backtracking yang berlebihan.

Contoh di bagian berikutnya mengilustrasikan kedua teknik untuk menangani RegexMatchTimeoutException.

Konstruktor

Nama Deskripsi
RegexMatchTimeoutException()

Menginisialisasi instans RegexMatchTimeoutException baru kelas dengan pesan yang disediakan sistem.

RegexMatchTimeoutException(SerializationInfo, StreamingContext)
Kedaluwarsa.

Menginisialisasi instans RegexMatchTimeoutException baru kelas dengan data berseri.

RegexMatchTimeoutException(String, Exception)

Menginisialisasi instans RegexMatchTimeoutException baru kelas dengan pesan kesalahan tertentu dan referensi ke pengecualian dalam yang merupakan penyebab pengecualian ini.

RegexMatchTimeoutException(String, String, TimeSpan)

Menginisialisasi instans RegexMatchTimeoutException baru kelas dengan informasi tentang pola ekspresi reguler, teks input, dan interval waktu habis.

RegexMatchTimeoutException(String)

Menginisialisasi instans RegexMatchTimeoutException baru kelas dengan string pesan yang ditentukan.

Properti

Nama Deskripsi
Data

Mendapatkan kumpulan pasangan kunci/nilai yang memberikan informasi tambahan yang ditentukan pengguna tentang pengecualian.

(Diperoleh dari Exception)
HelpLink

Mendapatkan atau mengatur tautan ke file bantuan yang terkait dengan pengecualian ini.

(Diperoleh dari Exception)
HResult

Mendapatkan atau mengatur HRESULT, nilai numerik berkode yang ditetapkan ke pengecualian tertentu.

(Diperoleh dari Exception)
InnerException

Mendapatkan instans Exception yang menyebabkan pengecualian saat ini.

(Diperoleh dari Exception)
Input

Mendapatkan teks input yang diproses mesin ekspresi reguler saat waktu habis terjadi.

MatchTimeout

Mendapatkan interval waktu habis untuk kecocokan ekspresi reguler.

Message

Mendapatkan pesan yang menjelaskan pengecualian saat ini.

(Diperoleh dari Exception)
Pattern

Mendapatkan pola ekspresi reguler yang digunakan dalam operasi pencocokan saat waktu habis terjadi.

Source

Mendapatkan atau mengatur nama aplikasi atau objek yang menyebabkan kesalahan.

(Diperoleh dari Exception)
StackTrace

Mendapatkan representasi string dari bingkai langsung pada tumpukan panggilan.

(Diperoleh dari Exception)
TargetSite

Mendapatkan metode yang melemparkan pengecualian saat ini.

(Diperoleh dari Exception)

Metode

Nama Deskripsi
Equals(Object)

Menentukan apakah objek yang ditentukan sama dengan objek saat ini.

(Diperoleh dari Object)
GetBaseException()

Ketika ditimpa di kelas turunan, mengembalikan Exception yang merupakan akar penyebab dari satu atau beberapa pengecualian berikutnya.

(Diperoleh dari Exception)
GetHashCode()

Berfungsi sebagai fungsi hash default.

(Diperoleh dari Object)
GetObjectData(SerializationInfo, StreamingContext)
Kedaluwarsa.

Saat ditimpa di kelas turunan, mengatur SerializationInfo dengan informasi tentang pengecualian.

(Diperoleh dari Exception)
GetType()

Mendapatkan jenis runtime instans saat ini.

(Diperoleh dari Exception)
MemberwiseClone()

Membuat salinan dangkal dari Objectsaat ini.

(Diperoleh dari Object)
ToString()

Membuat dan mengembalikan representasi string dari pengecualian saat ini.

(Diperoleh dari Exception)

Acara

Nama Deskripsi
SerializeObjectState
Kedaluwarsa.

Terjadi ketika pengecualian diserialisasikan untuk membuat objek status pengecualian yang berisi data berseri tentang pengecualian.

(Diperoleh dari Exception)

Implementasi Antarmuka Eksplisit

Nama Deskripsi
ISerializable.GetObjectData(SerializationInfo, StreamingContext)

Mengisi objek dengan data yang SerializationInfo diperlukan untuk membuat RegexMatchTimeoutException serialisasi objek.

Berlaku untuk

Lihat juga