CA1031: Genel özel durum türlerini yakalamayın
Özellik | Değer |
---|---|
Kural Kimliği | CA1031 |
Başlık | Genel özel durum türlerini yakalamayın |
Kategori | Tasarım |
Hataya neden olan veya bozulmayan düzeltme | Hataya neden olmayan |
.NET 8'de varsayılan olarak etkin | Hayır |
Neden
veya gibi System.ExceptionSystem.SystemException genel bir özel durum bir catch
deyimine yakalanmış veya gibi catch()
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 özel durum yakalanmamalı.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için daha belirli bir özel durum yakalayın veya bloktaki catch
son deyim olarak genel özel durumu yeniden oluşturun.
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'den başlayarak, ortak dil çalışma zamanı (CLR), yönetilen kod tarafından işlenmek üzere windows'taki erişim ihlalleri gibi işletim sisteminde ve yönetilen kodda oluşan bozuk durum özel durumları 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 .
Çözümlemek için kod yapılandırma
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 yakalanmaya izin verilmeyenlerini yapılandırabilirsiniz. Örneğin, kuralın işleyicilere ile bayrak catch
eklemesi gerektiğini belirtmek için projenizdeki bir .editorconfig dosyasına aşağıdaki anahtar-değer çiftini NullReferenceException
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)
- Simgenin belge kimliği biçiminde bir
T:
ön ek içeren tam 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 adla 'ExceptionType' adlı 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 ilgili tam adlarla eşleştirir. |
Bu seçenekleri 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.
Ö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 {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;
}
}
}