也许我不理解它,但是如果我有一个服务并且我从中捕获任何错误,那么zone.js
怎么会抛出404找不到,而我抓住错误并返回json对象所以客户会知道该怎么做。如何在控制台中避免该错误?我可以吗?
例如:
return this.http.post(this.callUrl, requestBody)
.map(this.extractData)
.catch(this.handleError);
}
private extractData(res: Response) {
let body = res.json();
return body || { };
}
private handleError (error: Response | any) {
let body = error.json();
return Observable.throw(body);
}
答案 0 :(得分:4)
问题在于你的handleError
函数,你传递给catch
的函数没有处理错误,它实际上将错误转换为新错误并传播它(失败了)。 Observable.prototype.catch
的目的是处理错误,Observable.throw
的目的是创建。然后返回此错误以在结果流中引入故障。
以下是使用普通Http接口的代码看起来像
async performPostRequest(requestBody) {
try {
await response = this.http.post(this.callUrl, requestBody);
return this.extractData(response);
} catch (error) {
handleError(error);
}
}
function handleError(error) {
const unwrappedError = error && typeof error.json === 'function'
? error.json()
: error;
throw unwrappedError;
}
我在评论中看到了Angular 2支持处理http错误的功能的讨论。它支持您可能需要的所有情况,包括处理404错误,但他们的文档非常糟糕。 他们所有的http示例以及他们的大多数示例都有太多的代码。
当我说代码太多时,我的意思是说它们的代码比你应该编写的代码多,而且很多代码根本就不应该写。
您在本问题的教程中粘贴了与其默认错误处理程序非常接近的内容,但未注意到该行为。
你应该永远不要这样做!
但严肃地说,他们为什么要处理所有例子中的所有错误?默认情况下,错误应始终未处理,以便它们在堆栈中向上传播并导致失败。
制定一个总是捕捉和重新抛弃的规则是一种可怕的做法。
如果你想要一个通用的错误处理程序,它肯定不属于每个消耗潜在错误来源的服务,那就是疯狂,但是如果你按照这些例子,那就是你最终会得到的。数百个重复的,不可维护的样板,下一个在项目上工作的人将不得不勉强了解你的业务逻辑。
此外,您应该不将未绑定的方法作为回调传递,就像您在示例中一样,但这是一个单独的对话。