【问题标题】:Why "fail" in promise does not catch errors?为什么承诺中的“失败”不会捕获错误?
【发布时间】:2012-05-21 16:22:24
【问题描述】:

我正在尝试访问一个可能不存在的文件:

var localFolder = Windows.Storage.ApplicationData.current.localFolder;

localFolder.getFileAsync(stateFile).then(function (file) {
            Windows.Storage.FileIO.readTextAsync(file).then(function (text) {
        // do something with the text

    });
}, function (err) {
    // log error, load dummy data

});

如果文件不存在,“失败”方法会被调用,但它仅在我的应用程序停止后发生,异常“找不到文件”。只有当我为调试器按“继续”时,它才会继续“失败”方法..

我做错了什么?我应该事先检查是否存在?

【问题讨论】:

  • 那为什么会有fail方法呢?我在这里有点迷路了.. :)
  • 算了,我以为你在说 jQuery 的承诺。对不起。
  • 我很确定 WinJS Promise == jQuery 在行为方面的承诺..
  • 如果行为与 jQuery 相同,fail 仅检查相关承诺的状态(拒绝或解决),而不处理内部异常/错误
  • 您的调试器可能设置为在第一次出现异常时停止。这意味着它将在处理异常之前闯入调试器。

标签: javascript windows-runtime promise winjs


【解决方案1】:

您看到的是第一次机会异常。调试器在抛出点中断。如果您点击调试器对话框上的“继续”按钮,应用程序将继续运行并且异常处理程序将运行。

您可以通过使用“调试|异常”菜单关闭首次机会异常来更改此设置。

【讨论】:

  • 你说得对,但作为开发人员,我不能关闭“第一次机会例外”,可以吗?所以我每次都会看到这个错误信息吗?
  • 当然可以。转到“调试”菜单,“例外”菜单项。在对话框中,您应该看到一个树视图。在“JavaScript Runtime Exceptions”下,关闭“Thrown”列中的复选框,这将关闭第一次机会异常的中断。不过,您可能希望记住此复选框的位置 - 在跟踪异步代码中的问题时,第一次机会异常会派上用场。
  • 但这正是我的观点。我知道我可以关闭该复选框。我只是说开发人员,我真的不应该。这就是为什么你的建议对我没有意义的原因:/
  • 这并不难。第一次机会例外真的很吵。因此,我认为最好在您发现问题之前关闭它们运行。然后重新打开它们,看看你是否遇到异常,调试,然后再次关闭它们。
  • 如果不知道这个“第一次机会”具体的事情,我会回答 try/catch 以忽略异常。毕竟,这意味着您希望 fail() 处理不存在的文件。
【解决方案2】:

我为同样的问题苦苦挣扎了两三天,终于得出以下解决方案:我使用getFilesAsync函数获取一个文件夹中所有文件的列表,然后查看这个列表是否需要文件已存在。之后,我可以调用 getFileAsyncs 而不抛出。不是很漂亮,但对我有用。我同意假设开发人员可以关闭异常并不是最好的建议……在我看来,这个问题应该被视为 RT 实现中的错误。

【讨论】:

    猜你喜欢
    • 2018-02-14
    • 2018-09-25
    • 1970-01-01
    • 2021-03-17
    • 2018-08-09
    • 1970-01-01
    • 2016-11-25
    • 1970-01-01
    • 2018-03-31
    相关资源
    最近更新 更多