Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
| Eigenschap | Waarde |
|---|---|
| Regel-id | CA1031 |
| Titel | Vang geen algemene uitzonderingstypen op |
| Categorie | Ontwerpen |
| Oplossing is wel 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-clausule zoals catch() wordt gebruikt.
Standaard markeert deze regel alleen algemene uitzonderingstypen die worden afgevangen, maar dit is aanpasbaar.
Beschrijving van regel
Algemene uitzonderingen mogen niet worden betrapt.
Hoe 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 de common language runtime (CLR) geen beschadigde statusuitzonderingen meer die optreden in het besturingssysteem en beheerde code, zoals toegangsschendingen in Windows, die door de beheerde code moeten worden verwerkt. 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 mogen worden opgevangen. Als u bijvoorbeeld wilt aangeven dat de regel handlers moet markeren met NullReferenceException, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Toegestane typenaamformaten 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 die de naam 'ExceptionType1' of 'ExceptionType2' hebben in de compilatie. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Komt overeen met specifieke typen die de naam 'ExceptionType' hebben en waarvan de naam volledig gekwalificeerd is. |
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 ze van toepassing zijn, of voor alle regels in deze categorie (Ontwerp) waarop ze van toepassing zijn. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Voorbeeld
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
{
private readonly FileStream? _inStream;
private readonly FileStream? _outStream;
public GenericExceptionsCaught(string inFile, string outFile)
{
try
{
_inStream = File.Open(inFile, FileMode.Open);
}
catch (SystemException)
{
Console.WriteLine($"Unable to open {inFile}.");
}
try
{
_outStream = File.Open(outFile, FileMode.Open);
}
catch
{
Console.WriteLine($"Unable to open {outFile}.");
}
}
}
public class GenericExceptionsCaughtFixed
{
private readonly FileStream? _inStream;
private readonly 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 {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 {outFile}.");
throw;
}
}
}