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

时间:2013-09-19 15:02:32

标签: javascript error-handling try-catch window.location

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

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

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

window.location.href = exportUrl,其中exportUrl将是上述网址。

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

但是,如果 出现错误,我会收到一个讨厌的HTTP Status 500页面,这对用户体验没有好处。我想做的是在结果页面上捕获任何错误,并在不离开当前页面的情况下抛出更友好的错误。我试过了:

try {
    window.location.href = exportUrl;
}
catch (e) {
    alert(e);
}

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

非常感谢。

1 个答案:

答案 0 :(得分:6)

捕获这样的错误只会捕获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);

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

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

更强大的方法是通过Ajax获取数据,通过base64encode构建数据网址,然后将window.location.href设置为该数据网址。

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

希望这有帮助!