如果Chrome中的fetch来电失败,那么我收到的唯一错误详情就是
TypeError:无法获取
在这种情况下,如何向最终用户显示信息性错误消息?
具体做法是:
是否可以获取有关提取失败原因的详细信息?
例如,如果服务器崩溃,Chrome DevTools可能会记录net:ERR_EMPTY_RESPONSE的控制台消息,但似乎无法从JavaScript访问它。
据我所知,答案是否定的;我认为这是出于安全原因,以避免让恶意JS通过检查错误消息找出哪些网站是无法访问的。
是否可以区分其他TypeError
的抓取错误?
如果我无法获得错误详情,我想至少取代可怕的模糊"无法取得"提供信息"无法访问该网站;请稍后重试"消息,我希望这样做,而不会有任何显示其他TypeError
消息的风险。
我在此处找到的唯一解决方案是检查实际的message
以查看它是否为"Failed to fetch"
。这显然是特定于浏览器的;它可以在Chrome中运行,看起来它可以在Chrome的任何用户语言中运行,而其他浏览器则需要自己的测试和处理。
答案 0 :(得分:9)
似乎没有关于网络/许可/输入问题的更多细节。
是否可以将fetch错误与其他TypeErrors区分开来?
是的,您只需要catch
fetch
来自fetch(…)
.catch(err => new FetchError(err))
.…
class FetchError extends Error {
constructor(orig) {
super();
this.message = "fetch error";
this.details = orig;
}
}
来自的错误:
(function (APP) {
var ctx;
APP.setContext = function (val) {
// protect rogue JS from setting the context.
if (ctx) {
return;
}
val = val || val.trim();
// Don't allow a double slash for a context.
if (val.charAt(0) === '/' && val.charAt(1) === '/') {
return;
}
// Context must both start and end in /.
if (val.length === 0 || val === '/') {
val = '/';
} else {
if (val.charAt(0) !== '/') {
val = '/' + val;
}
if (val.slice(-1) !== '/') {
val += '/';
}
}
ctx = val;
};
APP.getContext = function () {
return ctx || '/';
};
APP.getUrl = function (val) {
if (val && val.length > 0) {
return APP.getContext() + (val.charAt(0) === '/' ? val.substring(1) : val);
}
return APP.getContext();
};
})(window.APP = window.APP || {});