CA2200: Znovu vyvolejte pro zachování podrobností zásobníku
TypeName |
RethrowToPreserveStackDetails |
CheckId |
CA2200 |
Kategorie |
Microsoft.Usage |
Narušující změna |
Nenarušující |
Příčina
Výjimka je znovu vyvolána a je jednoznačně uvedena v příkazu throw.
Popis pravidla
Jakmile je vyvolána výjimka, část informací, které nese je trasování zásobníku.Trasování zásobníku je seznam hierarchie volání metod, který začíná metodou, který vyvolala výjimku a končí metodou, který výjimku zachytila.Pokud je výjimku vyvolána znovu určením výjimky v příkazu throw, je zásobník trasování restartován na dané metodě a seznam volání metod mezi původní metodou, která vyvolala výjimku a aktuální metodou je ztracen.Pro zachování původní informace trasování zásobníku s výjimkou, použijte příkaz throw bez určení výjimky.
Jak vyřešit porušení
Pro vyřešení porušení tohoto pravidla znovu vyvolejte výjimku bez výslovného určení výjimky.
Kdy potlačit upozornění
Nepotlačujte upozornění na toto pravidlo.
Příklad
Následující příklad ukazuje způsob, CatchAndRethrowExplicitly, který porušuje pravidlo a metodu, CatchAndRethrowImplicitly, která splňuje pravidlo.
Imports System
Namespace UsageLibrary
Class TestsRethrow
Shared Sub Main()
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
using System;
namespace UsageLibrary
{
class TestsRethrow
{
static void Main()
{
TestsRethrow testRethrow = new TestsRethrow();
testRethrow.CatchException();
}
void CatchException()
{
try
{
CatchAndRethrowExplicitly();
}
catch(ArithmeticException e)
{
Console.WriteLine("Explicitly specified:{0}{1}",
Environment.NewLine, e.StackTrace);
}
try
{
CatchAndRethrowImplicitly();
}
catch(ArithmeticException e)
{
Console.WriteLine("{0}Implicitly specified:{0}{1}",
Environment.NewLine, e.StackTrace);
}
}
void CatchAndRethrowExplicitly()
{
try
{
ThrowException();
}
catch(ArithmeticException e)
{
// Violates the rule.
throw e;
}
}
void CatchAndRethrowImplicitly()
{
try
{
ThrowException();
}
catch(ArithmeticException e)
{
// Satisfies the rule.
throw;
}
}
void ThrowException()
{
throw new ArithmeticException("illegal expression");
}
}
}