Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Egenskap | Värde |
---|---|
Regel-ID | CA1031 |
Title | Fånga inte allmänna undantagstyper |
Kategori | Design |
Korrigeringen är brytande eller icke-brytande | Obrytbar |
Aktiverad som standard i .NET 9 | Nej |
Orsak
Ett allmänt undantag som System.Exception eller System.SystemException fångas i en catch
instruktion eller en allmän catch-sats som catch()
används.
Som standard flaggar den här regeln endast allmänna undantagstyper som fångas, men detta kan konfigureras.
Regelbeskrivning
Generella undantag bör inte hanteras.
Så här åtgärdar du överträdelser
För att åtgärda ett brott mot denna regel, fånga ett mer specifikt undantag eller kasta om det allmänna undantaget som den sista satsen i catch
-blocket.
När du ska ignorera varningar
Ignorera inte en varning från den här regeln. Att fånga allmänna undantagstyper kan dölja körningsproblem för biblioteksanvändaren och försvåra felsökning.
Kommentar
Från och med .NET Framework 4 levererar common language runtime (CLR) inte längre skadade tillståndsundantag som inträffar i operativsystemet eller hanterad kod, till exempel åtkomstöverträdelser i Windows, så att de kan hanteras av hanterad kod. Om du vill kompilera ett program i .NET Framework 4 eller senare versioner och upprätthålla hanteringen av skadade tillståndsfel kan du använda HandleProcessCorruptedStateExceptionsAttribute attributet för den metod som hanterar undantaget för skadat tillstånd.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Du kan konfigurera det här alternativet för bara den här regeln, för alla regler som gäller för eller för alla regler i den här kategorin (design) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Otillåtna undantagstypnamn
Du kan konfigurera vilka undantagstyper som inte tillåts att fångas. Om du till exempel vill ange att regeln ska flagga catch
hanterare med NullReferenceException
lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Format för tillåtna typnamn i alternativvärdet (avgränsat med |
):
- Skriv endast typnamn (innehåller alla symboler med namnet, oavsett innehållande typ eller namnrymd)
- Fullständigt kvalificerade namn i symbolens dokumentations-ID-format med ett
T:
prefix.
Exempel:
Alternativvärde | Sammanfattning |
---|---|
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType |
Matchar alla symboler med namnet "ExceptionType" i kompilering. |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
Matchar alla symboler med namnet "ExceptionType1" eller "ExceptionType2" i kompilering. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Matchar specifika typer med namnet "ExceptionType" med det angivna fullständigt kvalificerade namnet. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
Matchar typer med namnen 'ExceptionType1' och 'ExceptionType2' med deras respektive fullt kvalificerade namn. |
Du kan konfigurera dessa alternativ för just den här regeln, för alla regler som de gäller för eller för alla regler i den här kategorin (Design) som de gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Exempel
I följande exempel visas en typ som bryter mot den här regeln och en typ som implementerar catch
blocket korrekt.
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 {inFile}.");
}
try
{
outStream = File.Open(outFile, FileMode.Open);
}
catch
{
Console.WriteLine($"Unable to open {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 {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;
}
}
}