Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
| Properti | Nilai |
|---|---|
| ID Aturan | CA2200 |
| Judul | Melemparkan ulang untuk mempertahankan rincian tumpukan |
| Kategori | Penggunaan |
| Perbaikan bersifat merusak atau tidak merusak | Tidak terputus |
| Diaktifkan secara default di .NET 10 | Sebagai peringatan |
| Bahasa yang berlaku | C# dan Visual Basic |
Penyebab
Pengecualian dilempar ulang dan secara eksplisit ditentukan dalam pernyataan throw.
Deskripsi aturan
Setelah pengecualian dilemparkan, bagian dari informasi yang dikandungnya adalah jejak tumpukan. Jejak tumpukan adalah daftar hierarki panggilan metode yang dimulai dengan metode yang melempar pengecualian dan berakhir dengan metode yang menangkap pengecualian. Jika pengecualian dilemparkan kembali dengan menyebutkan pengecualian dalam pernyataan throw, penelusuran tumpukan dimulai ulang pada metode saat ini dan daftar panggilan metode antara metode asli yang melempar pengecualian dan metode saat ini akan hilang. Untuk menyimpan informasi pelacakan tumpukan asli ketika terjadi pengecualian, gunakan pernyataan throw tanpa menentukan pengecualian.
Jika Anda melempar ulang pengecualian dari suatu tempat selain dari handler (catch blok), gunakan ExceptionDispatchInfo.Capture(Exception) untuk menangkap pengecualian di handler dan ExceptionDispatchInfo.Throw() ketika Anda ingin melempar ulangnya.
Untuk informasi selengkapnya, lihat Menangkap dan menumbuhkan kembali pengecualian dengan benar.
Cara memperbaiki pelanggaran
Untuk memperbaiki pelanggaran aturan ini, keluarkan kembali pengecualian tanpa menentukan pengecualian secara eksplisit.
Kapan harus menekan peringatan
Jangan menyembunyikan peringatan dari aturan ini.
Contoh
Contoh berikut menunjukkan metode, CatchAndRethrowExplicitly, yang melanggar aturan dan metode , CatchAndRethrowImplicitlyyang memenuhi aturan.
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