2 votes

Pourquoi l'exception est levée sur l'appelant au lieu de la ligne problématique ?

J'ai un programme simple :

class Program
{   
    static void Main(string[] args)
    {
        Run().Wait();
    }

    private static async Task Run()
    {
        string someVariable = null;
        someVariable.Replace(",", ".");
    }
}

La méthode Run() est intentionnellement conçue pour lever l'exception NullReferenceException. Ce qui me dérange, c'est pourquoi l'exception est levée à la ligne

Run.Wait()

plutôt que sur

someVariable.Replace(",",".");

L'exception actuelle est disponible dans InnerException - pourquoi ? Je perds le contexte de débogage, car l'exception est lancée en dehors de la méthode Run. enter image description here

Si mon programme est synchrone :

class Program
{
    static void Main(string[] args)
    {
        Run();
    }

    private static void Run()
    {
        string someVariable = null;
        someVariable.Replace(",", ".");
    }
}

est déclenchée sur la bonne ligne. Pourquoi l'asynchronisme casse-t-il cela ?

5voto

Nhan Phan Points 725

Lorsque vous appelez Run.Wait(), la méthode Run() a déclenché une exception nulle alors Attendez entraînera une AggregateException. En fait, vous ne perdez pas votre contexte. Si vous cliquez sur [ Voir les détails ] et voir le StackTrace de InnerException de l'exception actuelle, vous pouvez constater que l'exception provient de Exécuter() méthode :

enter image description here

3voto

Igor Meszaros Points 1158

Ce que dit @Nhan Phan est vrai.

Il existe également un autre moyen de résoudre ce problème : Au lieu d'utiliser .Wait() vous pouvez utiliser .GetAwaiter.GetResult() qui débloquera également l'AggregateException.

Si vous utilisez C# 7.1, vous pouvez avoir une async void Main et le await votre Run méthode

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X