C# VS2017没有';我没有给出异常的详细信息,只是用null崩溃了

C# VS2017没有';我没有给出异常的详细信息,只是用null崩溃了,c#,uwp,windows-community-toolkit,C#,Uwp,Windows Community Toolkit,我正在从事一个UWP项目,关于错误是如何呈现给我的,我感到有些奇怪。我不知道是VS2017还是UWP是如何设置的 我有一段代码可以在线检索json内容,有时代码可以工作,有时不能。当我使用UWP社区工具包中的Expander控件时,它工作,当我想要切换到GridView时,它失败。当它不工作时,它在HttpClient的GetStringAsync方法上失败。奇怪的行为是,在出现问题的方法中没有抛出异常,代码实际上会将我重定向回去,而不会给出错误,一旦它到达应该具有非null值的属性,我就会得到

我正在从事一个UWP项目,关于错误是如何呈现给我的,我感到有些奇怪。我不知道是VS2017还是UWP是如何设置的

我有一段代码可以在线检索json内容,有时代码可以工作,有时不能。当我使用UWP社区工具包中的Expander控件时,它工作,当我想要切换到GridView时,它失败。当它不工作时,它在HttpClient的GetStringAsync方法上失败。奇怪的行为是,在出现问题的方法中没有抛出异常,代码实际上会将我重定向回去,而不会给出错误,一旦它到达应该具有非null值的属性,我就会得到null异常。 这就是问题发生的地方:

string httpContent = "";

using (HttpClient httpClient = new HttpClient())
{
    try
    {
        httpContent = await httpClient.GetStringAsync(uri);
    }
    catch (Exception e)
    {
        // TODO: handle errors
        var x = "";
    }
}
这段代码是从视图模型中调用的。它以构造函数开始,RefreshServerKanesWrathDataAsync是解析json的方法

public CncOnlinePageViewModel()
{
    cnconline = new CncOnline();
    cnconline.RefreshServerKanesWrathDataAsync();
}
在我第二次访问GetStringAsync时,代码就像什么都没有发生一样返回到构造函数,但是该方法从未完成,它只是返回到构造函数,因此无法使用数据更新可观察的集合。然后我得到一个空异常

我想用VS2015来测试这一点,但我更新了一些控件,这些控件显然只在VS2017中支持,因此我无法在其他版本中运行代码

在此问题之前,我还遇到了一个代码问题,我试图在不使用令牌的情况下访问目录中的文件。行为完全相同,代码并没有告诉我我没有访问我想要读取的目录的权限,它只是将我从方法中扔回到调用读取目录的位置。就像当前的问题一样,我会遇到一个空异常,这不是主要问题所在


我将Template10和UWP community toolkit添加到项目中,如果有必要的话。

除非您愿意提供回调,否则不应该从构造函数调用异步方法

public CncOnlinePageViewModel()
{
    cnconline = new CncOnline();
    var t = cnconline.RefreshServerKanesWrathDataAsync(); // assuming returns Task<string>
    t.ContinueWith(OnCompleted);
}

private void OnCompleted(Task<string> task)
{
    if (task.IsFaulted)
    {
        // Check error
        var exception = task.Exception;
    }
    else if (task.IsCanceled)
    {
        // User hit cancel?
    }
    else
    {
        // All good!
        var result = task.Result;
    }
}
另一方面,当抛出任何异常时,您可能还需要Visual Studio 2017中断。在VS2017中,转到调试->窗口->异常设置,并确保检查公共语言运行时异常。如果有一个已填充的框,请单击该框,直到它变成复选标记

另外…,当任何任务有未观察到的异常时,您可以点击引发的事件。您可以在
App.xaml.cs

public App()
{
   TaskScheduler.UnobservedTaskException += OnUnobservedException;
}

private static void OnUnobservedException(object sender, UnobservedTaskExceptionEventArgs e)
{
   // Put break point here.
   var ex = e.Exception;

   // This will keep your app alive, but only do it if it's safe to continue.
   e.SetObserved(); 
}

除非您愿意提供回调,否则不应该从构造函数调用异步方法

public CncOnlinePageViewModel()
{
    cnconline = new CncOnline();
    var t = cnconline.RefreshServerKanesWrathDataAsync(); // assuming returns Task<string>
    t.ContinueWith(OnCompleted);
}

private void OnCompleted(Task<string> task)
{
    if (task.IsFaulted)
    {
        // Check error
        var exception = task.Exception;
    }
    else if (task.IsCanceled)
    {
        // User hit cancel?
    }
    else
    {
        // All good!
        var result = task.Result;
    }
}
另一方面,当抛出任何异常时,您可能还需要Visual Studio 2017中断。在VS2017中,转到调试->窗口->异常设置,并确保检查公共语言运行时异常。如果有一个已填充的框,请单击该框,直到它变成复选标记

另外…,当任何任务有未观察到的异常时,您可以点击引发的事件。您可以在
App.xaml.cs

public App()
{
   TaskScheduler.UnobservedTaskException += OnUnobservedException;
}

private static void OnUnobservedException(object sender, UnobservedTaskExceptionEventArgs e)
{
   // Put break point here.
   var ex = e.Exception;

   // This will keep your app alive, but only do it if it's safe to continue.
   e.SetObserved(); 
}

我做了更改,但OnCompleted有一个红色的曲线,错误是“参数1:无法从'method group'转换为'Action'”。有什么建议吗?请确保您的类型匹配
private void OnCompleted(Task Task)
public Task RefreshServerKanesWrathDataAsync()
的返回类型匹配。我添加了一个示例,其中您的方法只返回一个
Task
而不是
Task
。无法使其工作。RefreshServerKanesWrathDataAsync()是一个任务方法,它只获取一些联机数据并用它填充集合。我添加了这个签名“private void onCompleted(Task Task)”,以匹配刷新方法返回的内容,正如您所建议的那样,空异常返回了。在
onCompleted(Task Task)
的第一行放置一个断点。。。会发生什么?它被击中了吗?我做了更改,但OnCompleted有一个红色的曲线,错误是“参数1:无法从‘方法组’转换为‘操作’”。有什么建议吗?确保您的类型匹配
private void OnCompleted(Task Task)
public Task RefreshServerKanesWrathDataAsync()
的返回类型匹配。我添加了一个示例,其中您的方法只返回一个
Task
而不是
Task
。无法使其工作。RefreshServerKanesWrathDataAsync()是一个任务方法,它只获取一些联机数据并用它填充集合。我添加了这个签名“private void onCompleted(Task Task)”,以匹配刷新方法返回的内容,正如您所建议的那样,空异常返回了。在
onCompleted(Task Task)
的第一行放置一个断点。。。会发生什么?它被击中了吗?