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

Javascript:如何使用window.location.href=url捕获导航到的页面上的错误,javascript,error-handling,try-catch,window.location,Javascript,Error Handling,Try Catch,Window.location,我正在使用REST服务生成一个CSV文件,以提示用户下载。该服务的一个示例如下: https://localhost:8444/websvc/exportCSV?viewId=93282392 为了提示用户下载该文件,我使用以下代码: window.location.href=exportUrl,其中exportUrl将是与上述URL类似的URL 如果在执行服务时服务器上没有错误,这将非常有效。文件下载提示出现,页面不刷新,一切正常 然而,如果有错误,我会得到一个令人讨厌的HTTP状态500页面

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

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

为了提示用户下载该文件,我使用以下代码:

window.location.href=exportUrl
,其中
exportUrl
将是与上述URL类似的URL

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

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

try {
    window.location.href = exportUrl;
}
catch (e) {
    alert(e);
}
但这似乎根本没有改变人们的行为。有人对如何处理这件事有什么想法吗


非常感谢。

捕获这样的错误只会捕获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
构建数据URL,然后将
window.location.href
设置为该数据URL

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


希望这有帮助

非常感谢。当我等待答案时,我决定做一些类似的事情。我现在使用$.get()首先点击url,并在done()函数中输入window.location.href代码。在fail()函数中,我抛出了一个友好的错误,表示文件生成失败。这是可行的,但这意味着对服务器有两次完整的点击,我不太喜欢。需要注意的是,错误肯定发生在CSV生成过程中,因此我对您的第二个“更健壮”的想法感兴趣。您能否详细介绍如何使用
base64encode
构建数据URL?Thanks@MattPowell你找到解决办法了吗?(只需点击一次服务器)嗨@IceWhisper-不,对不起,我从来没有这样做过。在我的例子中,两次服务器点击是可以接受的,但是如果我需要一次服务器点击,我会运行
base64encode
数据URL。