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 | CA2200 |
| Başlık | Yığın ayrıntılarını korumak için yeniden fırlatın |
| Kategori | Kullanım |
| Düzeltme bozucu ya da bozmayan olabilir | Kesintisiz |
| .NET 10'da varsayılan olarak etkin | Uyarı olarak |
| Geçerli diller | C# ve Visual Basic |
Neden
Özel bir durum yeniden fırlatılır ve throw deyiminde açıkça belirtilir.
Kural açıklaması
Bir özel durum fırlatıldığında, taşıdığı bilgilerin bir bölümü yığın izi olur. Yığın izlemesi, özel durumu oluşturan yöntemiyle başlayan ve özel durumu yakalayan yöntemle biten yöntem çağrısı hiyerarşisinin listesidir. Eğer throw deyiminde bir özel durum belirtilerek yeniden fırlatılırsa, çağrı yığını geçerli yöntemde yeniden başlatılır ve özel durumu fırlatan orijinal yöntem ile geçerli yöntem arasındaki yöntem çağrıları listesi kaybolur. Özgün yığın izleme bilgilerini özel durumla birlikte tutmak için throw ifadesini, özel durumu belirtmeden kullanın.
Eğer bir işleyici (catch bloğu) dışındaki bir yerden istisnayı yeniden atıyorsanız, işleyicide istisnayı yakalamak için ExceptionDispatchInfo.Capture(Exception) kullanın ve yeniden atmak istediğinizde ExceptionDispatchInfo.Throw() kullanın.
Daha fazla bilgi için bkz Özel durumları düzgün bir şekilde yakalama ve yeniden atma.
İhlalleri düzeltme
Bu kuralın ihlalini düzeltmek için, özel durumu açıkça belirtmeden özel durumu yeniden oluşturun.
Uyarıların ne zaman bastırılması gerekiyor?
Bu kuraldan uyarıyı bastırmayın.
Örnek
Aşağıdaki örnekte, CatchAndRethrowExplicitlykuralı ihlal eden bir yöntemi ve kuralı karşılayan bir yöntem CatchAndRethrowImplicitlygösterilmektedir.
class TestsRethrow
{
static void Main2200()
{
TestsRethrow testRethrow = new();
testRethrow.CatchException();
}
void CatchException()
{
try
{
CatchAndRethrowExplicitly();
}
catch (ArithmeticException e)
{
Console.WriteLine($"Explicitly specified:{Environment.NewLine}{e.StackTrace}");
}
try
{
CatchAndRethrowImplicitly();
}
catch (ArithmeticException e)
{
Console.WriteLine($"{Environment.NewLine}Implicitly specified:{Environment.NewLine}{e.StackTrace}");
}
}
void CatchAndRethrowExplicitly()
{
try
{
ThrowException();
}
catch (ArithmeticException e)
{
// Violates the rule.
throw e;
}
}
void CatchAndRethrowImplicitly()
{
try
{
ThrowException();
}
catch (ArithmeticException)
{
// Satisfies the rule.
throw;
}
}
void ThrowException()
{
throw new ArithmeticException("illegal expression");
}
}
Imports System
Namespace ca2200
Class TestsRethrow
Shared Sub Main2200()
Dim testRethrow As New TestsRethrow()
testRethrow.CatchException()
End Sub
Sub CatchException()
Try
CatchAndRethrowExplicitly()
Catch e As ArithmeticException
Console.WriteLine("Explicitly specified:{0}{1}",
Environment.NewLine, e.StackTrace)
End Try
Try
CatchAndRethrowImplicitly()
Catch e As ArithmeticException
Console.WriteLine("{0}Implicitly specified:{0}{1}",
Environment.NewLine, e.StackTrace)
End Try
End Sub
Sub CatchAndRethrowExplicitly()
Try
ThrowException()
Catch e As ArithmeticException
' Violates the rule.
Throw e
End Try
End Sub
Sub CatchAndRethrowImplicitly()
Try
ThrowException()
Catch e As ArithmeticException
' Satisfies the rule.
Throw
End Try
End Sub
Sub ThrowException()
Throw New ArithmeticException("illegal expression")
End Sub
End Class
End Namespace