异步代码块中仅忽略异常

时间:2016-11-19 07:48:33

标签: c# exception asynchronous mvvm async-await

在我使用Nito.MVVM之前,我使用了普通的异步/等待,它给了我一个聚合异常,我可以阅读它并知道我拥有什么。但是自从Nito以来,我的异常被忽略了,程序从异步代码块跳转并继续执行。我知道它会捕获异常,因为当我在db2.Execute( "DELETE FROM Word WHERE id in ( SELECT id FROM Word as W LEFT JOIN WordSource AS ws ON ws.WordId = w.WordId WHERE ws.WordId IS NULL )"); 行放置一个断点时,它会在这里打破但catch(Exception ex)。我知道NotifyTask具有检查是否抛出异常的属性,但是在我放置它的地方,它会检查Task未完成的时间,而不是在我需要的时候。

查看型号:

ex = null

私人方法:

public FileExplorerPageViewModel(INavigationService navigationService)
        {
            _navigationService = navigationService;
            _manager = new FileExplorerManager();

            Files = NotifyTask.Create(GetFilesAsync("UniorDev", "GitRemote/GitRemote"));

        }

Manager方法(抛出异常的地方):

private async Task<ObservableCollection<FileExplorerModel>> GetFilesAsync(string login, string reposName)
        {
            return new ObservableCollection<FileExplorerModel>(await _manager.GetFilesAsync(login, reposName));
        }

使用try / catch或不使用它具有相同的效果。这种行为是我有NotifyTask的地方。

更新 没有事件,当发生异常时触发,但是有Property Changed事件,所以我使用它并添加了这段代码:

 public async Task<List<FileExplorerModel>> GetFilesAsync(string login, string reposName)
        {
            //try
            //{
                var gitHubFiles = await GetGitHubFilesAsync(login, reposName);

                var gitRemoteFiles = new List<FileExplorerModel>();

                foreach ( var file in gitHubFiles )
                {
                    if ( file.Type == ContentType.Symlink || file.Type == ContentType.Submodule ) continue;

                    var model = new FileExplorerModel
                    {
                        Name = file.Name,
                        FileType = file.Type.ToString()
                    };

                    if ( model.IsFolder )
                    {
                        var nextFiles = await GetGitHubFilesAsync(login, reposName);
                        var count = nextFiles.Count;
                    }

                    model.FileSize = file.Size.ToString();

                    gitRemoteFiles.Add(model);
                }

                return gitRemoteFiles;
            //}
            //catch ( WebException ex )
            //{
            //    throw new Exception("Something wrong with internet connection, try to On Internet " + ex.Message);
            //}
            //catch ( Exception ex )
            //{
            //    throw new Exception("Getting ExplorerFiles from github failed! " + ex.Message);
            //}
        }

异常不会引发火灾。 我在App类(主类)中添加了throw异常并且它被触发了。当我有来自XAML的异常时,它也会触发。因此,当它来自视图模型或其他东西时,它可能不会触发。我不知道。非常乐意为它提供一些帮助。 的更新

我们处理exception = null,但问题仍然存在。当应用程序开始在物理设备上启动时,我想要添加的内容,我很少这个问题。我读了一些关于它的信息,它似乎没有关联,但可能是: enter image description here

1 个答案:

答案 0 :(得分:3)

我不完全确定您的期望的行为是什么,但我希望您发现有用的一些信息。

NotifyTask是围绕Task的数据绑定包装器。这真的是它所做的一切。因此,如果其Task出现异常,那么它将更新自己的关于该异常的数据可绑定属性。当您希望UI响应完成的任务时,可以使用NotifyTask,例如,在任务正在进行时显示微调器,如果任务发生故障则显示错误消息,以及任务成功完成时的数据。 / p>

如果您希望应用程序响应任务错误(使用代码,而不仅仅是UI更新),那么您应该使用try / catch,就像您在{{1}中注释掉的那样}。 GetFilesAsync并未改变这些例外的工作方式;他们应该工作得很好。

  

我知道它会捕获异常,因为当我在catch(Exception ex)行上放置一个断点时,它会在这里断开但是ex = null。

那是不可能的。我建议你再试一次。

  

我知道NotifyTask有属性可以检查是否抛出了异常,但是我把它放在哪里,它会检查Task未完成的时间,而不是我需要的时候。

如果真的希望(异步)等待任务完成然后检查异常,那么你可以这样做:

NotifyTask

或者,如果您只想重新提出异常:

await Files.TaskCompleted;
var ex = Files.InnerException;

虽然我必须说这种用法非常不寻常。更合适的做法是在await Files.Task; 内加try / catch