CA1031: Ne kapja meg az általános kivételtípusokat
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA1031 |
Cím | Ne kapja meg az általános kivételtípusokat |
Kategória | Design |
A javítás kompatibilitástörő vagy nem törik | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Nem |
Ok
Egy általános kivétel, például System.ExceptionSystem.SystemException egy utasítás vagy egy catch
általános fogási záradék, például catch()
a használatban van.
Alapértelmezés szerint ez a szabály csak az általános kivételtípusokat jelöli, de ez konfigurálható.
Szabály leírása
Általános kivételeket nem szabad kifogni.
Szabálysértések kijavítása
A szabály megsértésének kijavításához észleljen egy konkrétabb kivételt, vagy az általános kivételt a blokk utolsó utasításaként hárítsa catch
el.
Mikor kell letiltani a figyelmeztetéseket?
Ne tiltsa el a szabály figyelmeztetését. Az általános kivételtípusok elfogása elrejtheti a futásidejű problémákat a tár felhasználója elől, és megnehezítheti a hibakeresést.
Feljegyzés
A 4. .NET-keretrendszer kezdve a közös nyelvi futtatókörnyezet (CLR) már nem biztosít sérült állapotbeli kivételeket, amelyek az operációs rendszerben és a felügyelt kódban fordulnak elő, például a Windows hozzáférés-megsértéseit, amelyeket felügyelt kóddal kell kezelni. Ha .NET-keretrendszer 4 vagy újabb verzióban szeretne lefordítani egy alkalmazást, és fenn szeretné tartani a sérült állapotkivételek kezelését, alkalmazhatja az HandleProcessCorruptedStateExceptionsAttribute attribútumot a sérült állapotkivételt kezelő metódusra.
Kód konfigurálása elemzéshez
A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.
Ezt a beállítást konfigurálhatja csak ehhez a szabályhoz, az összes szabályhoz, vagy az ebben a kategóriában (Tervezés) szereplő összes szabályhoz, amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.
Nem engedélyezett kivételtípusnevek
Beállíthatja, hogy mely kivételtípusok legyenek letiltva a lebukástól. Ha például meg szeretné adni, hogy a szabály a kezelőket megjelöljecatch
, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:NullReferenceException
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Engedélyezett típusnévformátumok a beállításértékben (a következővel |
elválasztva):
- Csak típusnév (a névvel ellátott összes szimbólumot tartalmazza, függetlenül attól, hogy milyen típust vagy névteret tartalmaz)
- A szimbólum dokumentációazonosító-formátumában szereplő teljes nevek előtaggal
T:
.
Példák:
Beállítás értéke | Összegzés |
---|---|
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType |
Megegyezik a fordításban található "ExceptionType" nevű szimbólumokkal. |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
A fordításban szereplő "ExceptionType1" vagy "ExceptionType2" szimbólumokkal egyezik. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
A megadott teljes névvel egyezik meg a "ExceptionType" nevű konkrét típusokkal. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
A "ExceptionType1" és az "ExceptionType2" nevű típusokat a megfelelő teljes névvel egyezik meg. |
Ezeket a beállításokat konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában (Tervezés) érvényes összes szabályra. További információ: Kódminőségi szabály konfigurációs beállításai.
Példa
Az alábbi példa egy olyan típust mutat be, amely megsérti ezt a szabályt, és egy olyan típust, amely megfelelően implementálja a catch
blokkot.
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;
}
}
}
Kapcsolódó szabályok
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: