也许我不明白,但是如果我有一个服务并且我从中捕获了任何错误,为什么 zone.js
会抛出 404 not found,而我捕获错误并且还返回 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);
}
最佳答案
问题是您的 handleError
函数,您传递给 catch
的函数不处理错误,它实际上将错误转换为新错误并传播(失败了)。 Observable.prototype.catch
的目的是处理错误,Observable.throw
的目的是创建它们。然后返回此错误以在结果流中引入故障。
这是使用普通 Http 接口(interface)的代码的样子
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 示例,以及他们的大多数一般示例,都有太多代码。
当我说代码太多时,我的意思是它们充满了比你应该写的更多的代码,还有很多你根本不应该写的代码。
您在这个问题的教程中粘贴了非常接近他们的默认错误处理程序的内容,但没有注意到行为。
你绝对不应该这样做!
但说真的,为什么他们要处理所有示例中的所有错误?默认情况下错误应该始终未处理,以便它们向上传播堆栈并在必须的地方导致失败。
制定总是捕获和重新抛出的规则是一种糟糕的做法。
如果你想要一个通用的错误处理程序,它绝对不属于每一个消耗潜在错误源的服务,那是疯狂的,但如果你遵循这些例子,那将是你最终得到的。数百行重复的、不可维护的样板文件,下一个从事该项目的人将不得不费力地读完它们才能理解您的业务逻辑。
此外,您应该不像在示例中那样将未绑定(bind)的方法作为回调传递,但那是一个单独的对话。
关于angular - 为什么当 http.post 失败时 zone.js 在有捕获和返回对象时抛出 404 Not Found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42474599/