在我使用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,但问题仍然存在。当应用程序开始在物理设备上启动时,我想要添加的内容,我很少这个问题。我读了一些关于它的信息,它似乎没有关联,但可能是:
答案 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
。