Angular2错误处理最佳实践

Angular2错误处理最佳实践,angular,error-handling,get,Angular,Error Handling,Get,我有一个关于Angular2错误处理的最佳实践的问题。下面是我用来捕获错误的代码: Getdata(data: object){ let body = JSON.stringify(data); let headers = new Headers({ 'Content-Type': 'application/json' }); return this.http.post('/getData', body) .map((r

我有一个关于Angular2错误处理的最佳实践的问题。下面是我用来捕获错误的代码:

Getdata(data: object){

        let body = JSON.stringify(data);
        let headers = new Headers({ 'Content-Type': 'application/json' });

        return this.http.post('/getData', body)
            .map((res) => res.json())
            .catch(this._errorHandler);
    }

  _errorHandler(error: Response){
        console.log("Error Dataservice", error);
        return Observable.throw(error || "Server Error");
    }
我是否需要为每个新方法创建一个捕获,还是可以始终使用_errorHandler


谢谢

仅在组件中捕获

这就是我在我的项目中所做的,它非常有效。服务永远不会被拦截。每个方法都返回一个流,所有参数都是流。将挡块放在部件内,并采取适当的措施

例外情况

有一些例外,我在两者之间抓住了

  • 获取身份验证令牌时出错,请处理该错误。重定向到登录页面
  • 执行多个调用时出错,请撤消更改
我很少处理中间的错误。大多数时候,流在组件中开始和结束,错误处理在组件中完成

示例

public getUsers$(userId$: Observable<string>): Observable<User[]>{
    return userId$.flatMap(
      userId => this.authService.getAuthToken$()
                    .flatMap(
                       authToken => this.http.get('url', {userId})
                                         .map(res => res.json())
   ); 
}
所有以
$
结尾的参数都是流

组件

public error = false;
public errorMessage = '';
public users$; 

constructor(private router: Router, private _userService: UserService){
    const userId$ = this.router.params.map(params => params['id']);
    this.users$ = this._userService.getUsers$(userId$)
        .catch(error => {
           this.error = true;
           //translate error into user friendly language
           this.errorMessage = error;
        });
}
HTML

<ul *ngIf="!error"> 
 <li *ngFor="let user of users$ | async " >{{user.name}}</li>
</ul>

{{user.name}

用户服务

public getUsers$(userId$: Observable<string>): Observable<User[]>{
    return userId$.flatMap(
      userId => this.authService.getAuthToken$()
                    .flatMap(
                       authToken => this.http.get('url', {userId})
                                         .map(res => res.json())
   ); 
}
public getUsers$(userId$:可观察):可观察{
返回userId$.flatMap(
userId=>this.authService.getAuthToken$()
.平面图(
authToken=>this.http.get('url',{userId})
.map(res=>res.json())
); 
}
AuthService将有一个catch块,如果找不到authtoken或会话已过期或任何原因,它会将用户重定向到登录页。Rest all places for all errors catch块位于组件上


我刚刚提出了这个示例,如果有任何错误,请告诉我。

服务中的Catch块和组件中的订阅错误回调

这是我在项目开发过程中使用的。服务中的catch块负责转换错误。组件中的错误回调负责更新任何视图逻辑

服务

public getUsers$(userId$: Observable<string>): Observable<User[]>{
    return userId$.flatMap(
      userId => this.authService.getAuthToken$()
                    .flatMap(
                       authToken => this.http.get('url', {userId})
                                         .map(res => res.json())
   ); 
}
我很少从api中以所需的格式获取所需的数据,因此我在.map()方法中转换数据,然后将catch块附加到序列中

// Service Class
getTableData(): Observable<Table>{
    return this.http.get('url')
        .map(res => {
            // transform data as needed
            return transformedData;
        }
        .catch(err => {
            // transform error as needed
            let transformedError = GlobalFunction.transformError(err);

            return Observable.throw(transformedError);
        }
}
组件

现在在我的组件中,我订阅了序列

// Component Class
ngOnInit(){
    this.loading = true;
    this.error = false;

    this.subscription = this.service.getTableData().subscribe(
        res => {
            this.table = res;
            this.loading = false;
        },
        err => {
            this.message = err.message;
            this.error = true;
            this.loading = false;
        }
     );
}

通过将我的所有数据转换包含在服务中,我保持了视图逻辑的良好和精简。我相信这种方法可以将各个部分分开。服务提供数据,组件更新视图。

这实际上取决于您的功能优先级。例如:如果用户执行任何操作,并且出现错误,我们应该始终记录他的用户错误。有关更多信息,请参见此处@mayur,那么我是否应该始终在de-catch方法中使用另一个函数?我认为没有必要,嗯。制作一个后端服务并记录错误只是为了跟踪。可以从我共享的url服务示例中检查日志和error@mayur问题是我每两分钟就写一次这篇文章。现在当我遇到某个错误时,我想启动组件中的一个函数。所以我想我需要为每个帖子制作一个不同的catcht,这样它们就不会互相覆盖。你认为呢?哦,是的,我认为你可以使用通用错误处理程序,而不是使它更复杂。你能添加一个示例吗?@user3356007你检查过这个示例了吗?