gpt4 book ai didi

angular - 为什么 Angular 的英雄之旅 http 错误处理程序接受任何类型的参数?

转载 作者:行者123 更新时间:2023-12-04 11:01:14 28 4
gpt4 key购买 nike

在 Angular 的英雄之旅教程中,作者为 http 服务 (hero-service) 编写了一个错误处理程序。我很困惑为什么作者选择将错误处理程序的错误参数类型设为 any,而在其他关于 http 客户端的 Angular 文档中,错误处理程序类型总是指定为 httperrorresponse 类型。

这是英雄之旅教程中的错误处理程序:https://angular.io/tutorial/toh-pt6#error-handling

  private handleError<T> (operation = 'operation', result?: T) {
return (error: any): Observable<T> => {

// TODO: send the error to remote logging infrastructure
console.error(error); // log to console instead

// TODO: better job of transforming error for user consumption
this.log(`${operation} failed: ${error.message}`);

// Let the app keep running by returning an empty result.
return of(result as T);
};
}

这是 Angular 的 httpclient 文档中提供的错误处理程序示例 https://angular.io/guide/http#getting-error-details

private handleError(error: HttpErrorResponse) {
if (error.error instanceof ErrorEvent) {
// A client-side or network error occurred. Handle it accordingly.
console.error('An error occurred:', error.error.message);
} else {
// The backend returned an unsuccessful response code.
// The response body may contain clues as to what went wrong,
console.error(
`Backend returned code ${error.status}, ` +
`body was: ${error.error}`);
}
// return an observable with a user-facing error message
return throwError(
'Something bad happened; please try again later.');
};

可以看到这里错误参数类型被指定为HttpErrorResponse。什么时候应该将错误参数输入为 any,什么时候应该更具体?

此外,如果我只是让 handleError 函数接受一个未类型化的参数:

handleError(error){

}

这和做有什么不同吗

handleError(error: Any){

}

最佳答案

RXJS 中的错误总是any 类型。链中的任何运算符(operator)都完全有可能抛出任何类型的错误。所以向下转换为 HttpErrorResponse 有点不安全,但它是允许的。

如果您只将 HttpClient 直接连接到此错误处理程序,那么它将是安全的。但是,有人可以添加某种自定义运算符(也许未找到从响应缓存中获取的运算符),并且该运算符可能会引发其他一些错误。这会导致运行时异常。

通常的最终结果是您最终隐藏了一个错误。早期运算符中的错误会导致错误。然后这个错误被这个处理程序捕获,它会遇到另一个错误,因为它不是一个 http 响应错误。只有第二个错误会打印到控制台。

因此,最好接受 any 并确保它是您想要彻底处理的异常类型。但如果您愿意冒险,也可以接受更窄的类型。

我不知道为什么作者选择做不同的事情,但第一个处理程序非常通用,除了打印错误对象外没有对错误对象做任何事情,所以向下转型没有任何优势。第二个可能只是试图通过向下转换而不显示额外的检查来简洁。

关于angular - 为什么 Angular 的英雄之旅 http 错误处理程序接受任何类型的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58782951/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com