CA1031: Nezachycujte výjimky obecného typu
Vlastnost | Hodnota |
---|---|
ID pravidla | CA1031 |
Název | Nezachycujte výjimky obecného typu |
Kategorie | Návrh |
Oprava způsobující chybu nebo chybu způsobující chybu | Nenarušující |
Povoleno ve výchozím nastavení v .NET 9 | No |
Příčina
Obecná výjimka, jako System.Exception je nebo System.SystemException je zachycena v catch
příkazu, nebo obecná klauzule catch, jako catch()
je například použití.
Ve výchozím nastavení toto pravidlo označí příznak pouze obecné typy výjimek, které jsou zachyceny, ale je to možné konfigurovat.
Popis pravidla
Obecné výjimky by neměly být zachycovány.
Jak opravit porušení
Chcete-li opravit porušení tohoto pravidla, zachyťte konkrétnější výjimku nebo znovu zvětšte obecnou výjimku jako poslední příkaz v catch
bloku.
Kdy potlačit upozornění
Nepotlačujte upozornění na toto pravidlo. Zachycení obecných typů výjimek může uživatelům knihovny skrýt problémy za běhu a může ztížit ladění.
Poznámka:
Počínaje rozhraním .NET Framework 4 už modul CLR (Common Language Runtime) nedoručuje poškozené výjimky stavu, ke kterým dochází v operačním systému a spravovaném kódu, jako jsou porušení přístupu ve Windows, které se mají zpracovávat spravovaným kódem. Pokud chcete zkompilovat aplikaci v rozhraní .NET Framework 4 nebo novějších verzích a zachovat zpracování výjimek poškozeného stavu, můžete HandleProcessCorruptedStateExceptionsAttribute použít atribut na metodu, která zpracovává výjimku poškozeného stavu.
Konfigurace kódu pro analýzu
Pomocí následující možnosti nakonfigurujte, ve kterých částech základu kódu se má toto pravidlo spouštět.
Tuto možnost můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která platí, nebo pro všechna pravidla v této kategorii (Návrh), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.
Nepovolené názvy typů výjimek
Můžete nakonfigurovat, které typy výjimek nejsou zachyceny. Pokud chcete například určit, že pravidlo má označit obslužné rutiny příznakem catch
NullReferenceException
, přidejte do souboru .editorconfig v projektu následující dvojici klíč-hodnota:
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Povolené formáty názvů typů v hodnotě možnosti (oddělené ):|
- Pouze název typu (zahrnuje všechny symboly s názvem bez ohledu na typ nebo obor názvů)
- Plně kvalifikované názvy ve formátu ID dokumentace symbolu s předponou
T:
.
Příklady:
Hodnota možnosti | Shrnutí |
---|---|
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType |
Odpovídá všem symbolům s názvem ExceptionType v kompilaci. |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
Odpovídá všem symbolům pojmenovaným ExceptionType1 nebo ExceptionType2 v kompilaci. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Odpovídá konkrétním typům s názvem ExceptionType s daným plně kvalifikovaným názvem. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
Odpovídá typům s názvem ExceptionType1 a ExceptionType2 s odpovídajícími plně kvalifikovanými názvy. |
Tyto možnosti můžete nakonfigurovat jenom pro toto pravidlo, pro všechna pravidla, která se vztahují, nebo pro všechna pravidla v této kategorii (Návrh), na která platí. Další informace naleznete v tématu Možnosti konfigurace pravidla kvality kódu.
Příklad
Následující příklad ukazuje typ, který porušuje toto pravidlo, a typ, který správně implementuje catch
blok.
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;
}
}
}