Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Özellik | Değer |
---|---|
Kural Kimliği | CA1031 |
Başlık | Genel özel durum türlerini yakalamayın |
Kategori | Tasarım |
Değişikliği bozucu veya bozmayan bir düzeltme | Kesintisiz |
.NET 9'da varsayılan olarak etkin | Hayır |
Neden
System.Exception veya System.SystemException gibi genel bir istisna durumu bir catch
deyiminde yakalanır veya catch()
gibi genel bir catch yan tümcesi kullanılır.
Varsayılan olarak, bu kural yalnızca yakalanan genel özel durum türlerini işaretler, ancak bu yapılandırılabilir.
Kural açıklaması
Genel istisnalar yakalanmamalı.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için daha belirli bir özel durum yakalayın veya catch
bloğundaki son deyim olarak genel bir özel durumu tekrar fırlatın.
Uyarıların ne zaman bastırılması gerekiyor?
Bu kuraldan uyarıyı bastırmayın. Genel özel durum türlerini yakalamak, çalışma zamanı sorunlarını kitaplık kullanıcısından gizleyebilir ve hata ayıklamayı zorlaştırabilir.
Not
.NET Framework 4'ten itibaren, ortak dil çalışma zamanı (CLR), Windows'taki erişim ihlalleri gibi işletim sistemi ve yönetilen kodda oluşan bozuk durum özel durumlarını yönetilen kod tarafından ele alınmak üzere sunmaz. .NET Framework 4 veya sonraki sürümlerinde bir uygulama derlemek ve bozuk durum özel durumlarının işlenmesini sürdürmek istiyorsanız, özniteliğini bozuk durum özel durumunu işleyen yönteme uygulayabilirsiniz HandleProcessCorruptedStateExceptionsAttribute .
Kodları çözümlemek için yapılandırın
Bu kuralın kod tabanınızın hangi bölümlerinde çalıştırılacaklarını yapılandırmak için aşağıdaki seçeneği kullanın.
Bu seçeneği yalnızca bu kural, geçerli olduğu tüm kurallar veya bu kategorideki (Tasarım) tüm kurallar için yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.
İzin verilmeyen özel durum türü adları
Hangi özel durum türlerinin yakalanmasına izin verilmeyeceğini yapılandırabilirsiniz. Örneğin, catch
ve NullReferenceException
ile işaretlenecek işleyicileri belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini ekleyin:
dotnet_code_quality.CA1031.disallowed_symbol_names = NullReferenceException
Seçenek değerinde izin verilen tür adı biçimleri (ile |
ayrılmış):
- Yalnızca tür adı (içeren tür veya ad alanına bakılmaksızın ada sahip tüm simgeleri içerir)
-
T:
ön ek ile simgenin belge kimliği biçimindeki tam nitelikli adlar.
Örnekler:
Seçenek değeri | Özet |
---|---|
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType |
Derlemedeki 'ExceptionType' adlı tüm sembolleri eşleştirir. |
dotnet_code_quality.CA1031.disallowed_symbol_names = ExceptionType1|ExceptionType2 |
Derlemedeki 'ExceptionType1' veya 'ExceptionType2' adlı tüm sembolleri eşleştirir. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS.ExceptionType |
Verilen tam nitelikli ad ile 'ExceptionType' adı verilen belirli türleri eşleştirir. |
dotnet_code_quality.CA1031.disallowed_symbol_names = T:NS1.ExceptionType1|T:NS1.ExceptionType2 |
'ExceptionType1' ve 'ExceptionType2' adlı türleri, bunların tam nitelikli adlarıyla eşleştirir. |
Bu seçenekleri yalnızca bu kural için, uyguladıkları tüm kurallar için veya bu kategorideki tüm kurallar için (Tasarım) yapılandırabilirsiniz. Daha fazla bilgi için bkz . Kod kalitesi kuralı yapılandırma seçenekleri.
Örnek
Aşağıdaki örnekte bu kuralı ihlal eden bir tür ve bloğu doğru uygulayan bir tür gösterilmektedir catch
.
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;
}
}
}
İlgili kurallar
CA2200: Yığın ayrıntılarını korumak amacıyla yeniden fırlatma