Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA1031 |
Cím | Ne kezelje az általános kivételtípusokat |
Kategória | Tervezés |
A javítás okoz problémát, vagy nem okoz problémát | Nem törés |
Alapértelmezés szerint engedélyezve a .NET 9-ben | Nem |
Ok
Egy általános kivétel, mint például System.Exception vagy System.SystemException, el van kapva egy catch
utasításban, vagy egy általános fogási záradék, mint például catch()
, van használatban.
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
Az általános kivételeket nem szabad elkapni.
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.
Elemzéshez konfigurált kód
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 ne legyenek elfogva. Ha például meg szeretné adni, hogy a szabály a catch
kezelőket NullReferenceException
megjelölje, adja hozzá a következő kulcs-érték párost a projekt egyik .editorconfig fájljához.
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 |
Megfelel a fordítás során található "ExceptionType" nevű szimbólumoknak. |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
A fordítás során az "ExceptionType1" vagy az "ExceptionType2" nevű szimbólumokkal egyezik. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Megadott teljes névvel egyező 'ExceptionType' nevű konkrét típusokat keres. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
Az 'ExceptionType1' és 'ExceptionType2' nevű típusokat a megfelelő teljesen kvalifikált nevekkel párosítja. |
Ezeket a beállításokat konfigurálhatja csak erre a szabályra, az összes szabályra, vagy az ebben a kategóriában szereplő összes szabályra (Tervezési), amelyekre vonatkoznak. 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 {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;
}
}
}