Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
| Propriété | Valeur |
|---|---|
| Identificateur de la règle | CA2200 |
| Titre | Relancer une exception pour conserver les détails de la pile d'exécution |
| Catégorie | Utilisation |
| Le correctif a un effet disruptif ou non disruptif | Sans rupture |
| Activé par défaut dans .NET 10 | Comme avertissement |
| Langues applicables | C# et Visual Basic |
Cause
Une exception est à nouveau levée et est spécifiée explicitement dans l’instruction throw.
Description de la règle
Une fois qu’une exception est levée, une partie des informations qu’elle contient est la trace de pile. La trace de la pile est une liste de la hiérarchie des appels de méthode qui commence par la méthode qui lève l’exception et se termine par la méthode qui intercepte l’exception. Si une exception est à nouveau levée en spécifiant l'exception dans l'instruction throw, le suivi de la pile reprend à partir de la méthode actuelle et la liste des appels de méthode entre la méthode d'origine qui a levé l'exception et la méthode actuelle disparaît. Pour conserver les informations de trace de la pile d’origine avec l’exception, utilisez l’instruction throw sans spécifier l’exception.
Si vous levez à nouveau l’exception à partir d’un autre emplacement que le gestionnaire (bloc catch), utilisez ExceptionDispatchInfo.Capture(Exception) pour capturer l’exception dans le gestionnaire et ExceptionDispatchInfo.Throw() quand vous souhaitez la lever à nouveau.
Pour plus d'informations, consultez Capturer et relancer correctement les exceptions.
Comment corriger les violations
Pour corriger une violation de cette règle, levez à nouveau l’exception sans spécifier explicitement l’exception.
Quand supprimer les avertissements
Ne supprimez pas un avertissement provenant de cette règle.
Exemple
L’exemple suivant montre une méthode, CatchAndRethrowExplicitlyqui enfreint la règle et une méthode, CatchAndRethrowImplicitlyqui satisfait à la règle.
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