CA1031: Algemene uitzonderingstypen niet vangen
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA1031 |
Titel | Algemene uitzonderingstypen niet ondervangen |
Categorie | Ontwerpen |
Oplossing is brekend of niet-brekend | Niet-brekend |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een algemene uitzondering zoals System.Exception of System.SystemException wordt gevangen in een catch
verklaring, of een algemene catch-component zoals catch()
wordt gebruikt.
Deze regel markeert standaard alleen algemene uitzonderingstypen die worden gevangen, maar dit kan worden geconfigureerd.
Beschrijving van regel
Algemene uitzonderingen mogen niet worden betrapt.
Schendingen oplossen
U kunt een schending van deze regel oplossen door een specifiekere uitzondering te ondervangen of de algemene uitzondering opnieuw te werpen als de laatste instructie in het catch
blok.
Wanneer waarschuwingen onderdrukken
Een waarschuwing van deze regel niet onderdrukken. Het opsporen van algemene uitzonderingstypen kan runtimeproblemen van de bibliotheekgebruiker verbergen en kan foutopsporing moeilijker maken.
Notitie
Vanaf .NET Framework 4 levert common language runtime (CLR) geen beschadigde statusuitzonderingen meer die optreden in het besturingssysteem en beheerde code, zoals toegangsschendingen in Windows, die moeten worden verwerkt door beheerde code. Als u een toepassing in .NET Framework 4 of hoger wilt compileren en de verwerking van beschadigde status-uitzonderingen wilt behouden, kunt u het HandleProcessCorruptedStateExceptionsAttribute kenmerk toepassen op de methode waarmee de beschadigde status-uitzondering wordt verwerkt.
Code configureren om te analyseren
Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.
U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (ontwerp) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Namen van uitzonderingstypen zijn niet toegestaan
U kunt configureren welke uitzonderingstypen niet zijn toegestaan. Als u bijvoorbeeld wilt opgeven dat de regel handlers moet markerencatch
, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw NullReferenceException
project:
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Toegestane typenaamnotaties in de optiewaarde (gescheiden door |
):
- Typ alleen de naam (inclusief alle symbolen met de naam, ongeacht het type of de naamruimte)
- Volledig gekwalificeerde namen in de documentatie-id-indeling van het symbool met een
T:
voorvoegsel.
Voorbeelden:
Optiewaarde | Samenvatting |
---|---|
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType |
Komt overeen met alle symbolen met de naam 'ExceptionType' in de compilatie. |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
Komt overeen met alle symbolen met de naam 'ExceptionType1' of 'ExceptionType2' in de compilatie. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Komt overeen met specifieke typen met de naam 'ExceptionType' met een volledig gekwalificeerde naam. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
Komt overeen met typen met de naam 'ExceptionType1' en 'ExceptionType2' met respectievelijke volledig gekwalificeerde namen. |
U kunt deze opties configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (ontwerp) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Opmerking
In het volgende voorbeeld ziet u een type dat deze regel schendt en een type dat het catch
blok correct implementeert.
Imports System
Imports System.IO
Namespace ca1031
' Creates two violations of the rule.
Public Class GenericExceptionsCaught
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
Catch ex As SystemException
Console.WriteLine("Unable to open {0}.", inFile)
End Try
Try
outStream = File.Open(outFile, FileMode.Open)
Catch
Console.WriteLine("Unable to open {0}.", outFile)
End Try
End Sub
End Class
Public Class GenericExceptionsCaughtFixed
Dim inStream As FileStream
Dim outStream As FileStream
Sub New(inFile As String, outFile As String)
Try
inStream = File.Open(inFile, FileMode.Open)
' Fix the first violation by catching a specific exception.
Catch ex As FileNotFoundException
Console.WriteLine("Unable to open {0}.", inFile)
' For functionally equivalent code, also catch the
' remaining exceptions that may be thrown by File.Open
End Try
Try
outStream = File.Open(outFile, FileMode.Open)
' Fix the second violation by re-throwing the generic
' exception at the end of the catch block.
Catch
Console.WriteLine("Unable to open {0}.", outFile)
Throw
End Try
End Sub
End Class
End Namespace
// Creates two violations of the rule.
public class GenericExceptionsCaught
{
FileStream? inStream;
FileStream? outStream;
public GenericExceptionsCaught(string inFile, string outFile)
{
try
{
inStream = File.Open(inFile, FileMode.Open);
}
catch (SystemException)
{
Console.WriteLine("Unable to open {0}.", inFile);
}
try
{
outStream = File.Open(outFile, FileMode.Open);
}
catch
{
Console.WriteLine("Unable to open {0}.", outFile);
}
}
}
public class GenericExceptionsCaughtFixed
{
FileStream? inStream;
FileStream outStream;
public GenericExceptionsCaughtFixed(string inFile, string outFile)
{
try
{
inStream = File.Open(inFile, FileMode.Open);
}
// Fix the first violation by catching a specific exception.
catch (FileNotFoundException)
{
Console.WriteLine("Unable to open {0}.", inFile);
};
// For functionally equivalent code, also catch
// remaining exceptions that may be thrown by File.Open
try
{
outStream = File.Open(outFile, FileMode.Open);
}
// Fix the second violation by rethrowing the generic
// exception at the end of the catch block.
catch
{
Console.WriteLine("Unable to open {0}.", outFile);
throw;
}
}
}