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

Lor*_*eno 2 .net c# debugging exception visual-studio

我有一个简单的程序:

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

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

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

Run.Wait()
Run Code Online (Sandbox Code Playgroud)

而不是

someVariable.Replace(",",".");
Run Code Online (Sandbox Code Playgroud)

InnerException中提供了实际的异常-为什么?我丢失了调试上下文,因为在Run方法之外引发了异常。 在此处输入图片说明

如果我的程序是同步的:

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

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

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

Nha*_*han 5

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

在此处输入图片说明