Javascript:如何捕获导航到使用window.location.href = url的页面上的错误

Meg*_*att 14 javascript error-handling try-catch window.location

我正在使用REST服务生成一个CSV文件,我想提示用户下载.该服务的一个例子如下:

https://localhost:8444/websvc/exportCSV?viewId=93282392

要提示用户下载文件,我使用以下代码:

window.location.href = exportUrl,其中exportUrl一个URL就像上面的那个.

如果在执行服务时服务器上没有错误,这种方法很有用.出现文件下载提示,页面不刷新,一切正常.

然而,如果一个错误,我越来越讨厌的HTTP状态500页,这是不利于用户体验.我想做的是在结果页面上捕获任何错误,并在不离开当前页面的情况下抛出更友好的错误.我试过了:

try {
    window.location.href = exportUrl;
}
catch (e) {
    alert(e);
}
Run Code Online (Sandbox Code Playgroud)

但这似乎并没有改变行为.有没有人对如何处理这个有任何想法?

非常感谢.

dan*_*ins 7

捕获这样的错误只会捕获JavaScript错误.那不是你在这里遇到的.您的服务器返回的状态代码为500.在将用户发送给用户之前,您需要确保一切都很好.

为此,您可以使用Ajax有效地"ping"URL,以确保它不会返回500错误.

类似于以下内容:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    if(xhr.readyState == 4 && xhr.status == 200) {
        window.location.href = exportUrl;
    }
}

xhr.open('head',exportUrl);
xhr.send(null);
Run Code Online (Sandbox Code Playgroud)

这将对URL执行HEAD请求,以确保没有令人讨厌的服务器错误等待.

当然,如果在实际生成CSV的过程中,您的服务器会抛出错误 - 它仍然会返回500.

一种更健壮的方法是通过Ajax获取数据,通过构建数据URL base64encode然后设置window.location.href为该数据URL.

通过这样做,您还可以确保Ajax没有返回500,并且您获得了响应中预期的数据.

希望这可以帮助!

  • 非常感谢.当我在等待答案时,我决定做类似的事情.我现在使用$ .get()来命中url*first*,而在done()函数中我放了window.location.href代码.在fail()函数中,我抛出一个友好的错误,说文件生成不成功.这是有效的,但这意味着服务器有两个完整的命中,我不是它的忠实粉丝.重要的是要注意,错误肯定发生在CSV*生成*期间,所以我对你的第二个"更强大"的想法感兴趣.您可以使用`base64encode`扩展如何构建数据URL吗?谢谢 (2认同)