CA2200: Eseguire il rethrow per conservare i dettagli dello stack
TypeName |
RethrowToPreserveStackDetails |
CheckId |
CA2200 |
Category |
Microsoft.Usage |
Breaking Change |
Non sostanziale |
Causa
Viene rigenerata un'eccezione e quest'ultima è specificata in modo esplicito nell'istruzione throw.
Descrizione della regola
Dopo che è stata generata un'eccezione, parte delle informazioni in essa contenute è data dalla traccia dello stack. La traccia dello stack è un elenco della gerarchia delle chiamate ai metodi che inizia con il metodo che genera l'eccezione e termina con quello che la rileva. Se un'eccezione viene rilanciata specificandola nell'istruzione throw, la traccia dello stack viene riavviata in corrispondenza del metodo corrente e l'elenco delle chiamate ai metodi tra il metodo originale che ha generato l'eccezione e il metodo corrente va perso. Per mantenere con l'eccezione le informazioni della traccia dello stack originale, utilizzare l'istruzione throw senza specificare l'eccezione.
Come correggere le violazioni
Per correggere una violazione di questa regola, rigenerare l'eccezione senza specificarla in modo esplicito.
Esclusione di avvisi
Non escludere un avviso da questa regola.
Esempio
Nell'esempio riportato di seguito vengono illustrati il metodo CatchAndRethrowExplicitly che viola la regola e il metodo CatchAndRethrowImplicitly che la soddisfa.
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");
}
}
}