Como lidar com códigos de status http diferentes de 200 no Angular 2

Agora, a maneira que eu faço solicitações http (emprestado desta resposta ) é esta:

POST(url, data) { var headers = new Headers(), authtoken = localStorage.getItem('authtoken'); headers.append("Content-Type", 'application/json'); if (authtoken) { headers.append("Authorization", 'Token ' + authtoken) } headers.append("Accept", 'application/json'); var requestoptions = new RequestOptions({ method: RequestMethod.Post, url: this.apiURL + url, headers: headers, body: JSON.stringify(data) }) return this.http.request(new Request(requestoptions)) .map((res: Response) => { if (res) { return { status: res.status, json: res.json() } } }); } 

Isso funciona bem, exceto pelo fato de que o angular2 falhará se o código de status retornado for algo diferente de 200. Por exemplo, se um usuário quiser postar algo e o servidor retornar 400, o ângulo 2 lançará a exceção:

exceção não capturada: [object Object]

Como posso evitar isso? Gostaria de lidar com esses códigos de status no meu aplicativo para melhorar a experiência do usuário (mostrar erros etc.)

Sim, você pode lidar com o operador catch assim e mostrar o alerta que quiser, mas primeiro você tem que importar Rxjs para o mesmo como este caminho

 import {Observable} from 'rxjs/Rx'; return this.http.request(new Request(this.requestoptions)) .map((res: Response) => { if (res) { if (res.status === 201) { return [{ status: res.status, json: res }] } else if (res.status === 200) { return [{ status: res.status, json: res }] } } }).catch((error: any) => { if (error.status === 500) { return Observable.throw(new Error(error.status)); } else if (error.status === 400) { return Observable.throw(new Error(error.status)); } else if (error.status === 409) { return Observable.throw(new Error(error.status)); } else if (error.status === 406) { return Observable.throw(new Error(error.status)); } }); } 

também você pode handel erro (com err bloco) que é jogar pelo bloco catch enquanto function. .map ,

como isso –

 ... .subscribe(res=>{....} err => {//handel here}); 

Atualizar

conforme necessário para qualquer status sem verificar, em particular, você pode tentar isso:

 return this.http.request(new Request(this.requestoptions)) .map((res: Response) => { if (res) { if (res.status === 201) { return [{ status: res.status, json: res }] } else if (res.status === 200) { return [{ status: res.status, json: res }] } } }).catch((error: any) => { if (error.status < 400 || error.status ===500) { return Observable.throw(new Error(error.status)); } }) .subscribe(res => {...}, err => {console.log(err)} );