为什么在调用者而不是有问题的行上引发异常

时间:2018-08-21 08:50:06

标签: c# .net visual-studio debugging exception

我有一个简单的程序:

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

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

Run()方法被故意设计为引发NullReferenceException。令我困扰的是为什么在网上抛出异常

Run.Wait()

代替

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

InnerException中提供了实际的异常-为什么?我丢失了调试上下文,因为在Run方法之外引发了异常。 enter image description here

如果我的程序是同步的:

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

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

异常被抛出在正确的行上。为什么异步会打破这个?

2 个答案:

答案 0 :(得分:5)

调用Run.Wait()时,Run()方法引发了空异常,然后Wait方法将引发AggregateException。顺便说一句,您不会失去上下文。如果单击[查看详细信息]并查看当前异常的 InnerException StackTrace ,则可以发现该异常来自 Run()方法:

enter image description here

答案 1 :(得分:3)

@Nhan Phan所说的是真的。

还有另一种方法可以解决此问题: 除了使用.Wait()以外,您还可以使用.GetAwaiter.GetResult()来解开AggregateException。

如果您使用的是C#7.1,则可以使用async void Mainawait的{​​{1}}方法