In Filterblöcken keine Ausnahmen auslösen

     TypeName

DoNotRaiseExceptionsInFilterBlocks

CheckId

CA2219

Kategorie

Microsoft.Usage

Unterbrechende Änderung

NonBreaking

Ursache

Eine Methode enthält einen gefilterten Ausnahmehandler, und der Filter löst Ausnahmen aus.

Regelbeschreibung

Wenn ein Ausnahmefilter eine Ausnahme auslöst, wird die Ausnahme durch die Common Language Runtime abgefangen, und der Filter gibt false zurück. Dieses Verhalten kann nicht davon unterschieden werden, wenn der Filter wie beabsichtigt ausgeführt wird und false zurückgibt.

Derzeit werden Ausnahmefilter von Visual Basic .NET und Visual C++ unterstützt.

Behandlung von Verstößen

Um einen Verstoß gegen diese Regel zu beheben, lösen Sie in einem Ausnahmefilter keine Ausnahmen aus.

Warnungsausschluss

Schließen Sie keine Warnung dieser Regel aus. Es gibt keine Szenarien, in denen eine durch einen Ausnahmefilter ausgelöste Ausnahme einen Vorteil gegenüber dem ausgeführten Code darstellt.

Beispiel

Im folgenden Beispiel wird ein Typ veranschaulicht, der gegen diese Regel verstößt. Sie sehen, dass der Filter angezeigt wird und false zurückgibt, wenn er eine Ausnahme auslöst.

Imports System
Module ExceptionFilter
Public Class FilterTest
   
   ' The following function is used as an exception filter.
   ' Violates rule: DoNotRaiseExceptionsInFilterBlocks.
   Public Function AlwaysTrueFilter(label as String) as Boolean
       Console.WriteLine("In filter for {0}.", label)
       ' The following exception terminates the filter.
       ' The common language runtime does not return the exception to the user.
       Throw New ApplicationException("Filter generated exception.")
       Return True
   End Function
   
   Public Sub ThrowException()
   Try
      Throw New ApplicationException("First exception.")

      ' Because the filter throws an exception, this catch clause fails to catch the exception.
      Catch e as ApplicationException When Not AlwaysTrueFilter("First")
            Console.WriteLine("Catching first filtered ApplicationException {0}", e)
            
      ' Because the previous catch fails, this catch handles the exception.
      Catch e as ApplicationException 
      Console.WriteLine("Catching any ApplicationException - {0}", e.Message)
      
    End Try 
    
    ' The behavior is the same when the filter test is reversed.
    Try   
      Throw New ApplicationException("Second exception.")
 
      ' Change the filter test from When Not to When.
      
      ' This catch fails.
      Catch e as ApplicationException When AlwaysTrueFilter("Second")
            Console.WriteLine("Catching second filtered ApplicationException {0}", e)
            
      ' This catch handles the exception.
      Catch e as ApplicationException 
      Console.WriteLine("Catching any ApplicationException - {0}", e.Message)
   End Try  
   End Sub 
   
End Class 
Sub  Main()
        Dim  test as FilterTest = New FilterTest()
        
        test.ThrowException()
   End Sub
End Module

Das Beispiel erzeugt folgende Ausgabe.

Ausgabe

In filter for First.
Catching any ApplicationException - First exception.
In filter for Second.
Catching any ApplicationException - Second exception.