在我的Angular应用程序中,有一个全局错误处理程序和一个负责进行http
调用的服务,返回类型为Observable<any>
。有些服务已明确处理了错误,而有些则没有。
对于尚未捕获的那些,全局错误(具有类' CustomErrorHandler ')运行良好。对于已经妥善处理并捕获的服务调用,全局错误似乎没有触发。
我的问题:是否有一种方法可以执行全局错误处理,而不管是否已经处理了http服务调用?
custom-error-handler.service.ts
@Injectable()
export class CustomErrorHandler implements ErrorHandler {
constructor(private injector: Injector) { }
handleError(error) {
error = error || new Error('There was an unexpected error');
const loggingService: LoggerService = this.injector.get(LoggerService);
const location = this.injector.get(LocationStrategy);
const message = error.message ? error.message : error.toString();
const url = location instanceof PathLocationStrategy
? location.path() : '';
// get the stack trace, lets grab the last 10 stacks only
StackTrace.fromError(error).then(stackframes => {
const stackString = stackframes
.splice(0, 20)
.map((sf) => {
return sf.toString();
}).join('\n');
// log with logging service
loggingService.error({ message, url, stack: stackString });
});
throw error;
}
}
auth.service.ts
@Injectable()
export class UserAuthService {
login(emailAddress: string, password: string): Observable<boolean> {
if (this.isAuthenticated()) {
return Observable.of(true);
}
return Observable.create(observer => {
this.http.get('http://someurl/login')
.map(res => res.json())
.subscribe(
data => {
observer.next(this.isAuthorized);
observer.complete();
}, err => {
observer.error(err);
}
);
});
}
}
my-component.ts
import { UserAuthService } from '../services/auth.service';
@Component({
selector: 'my-component',
templateUrl: './my-component.html',
styleUrls: ['./my-component.scss']
})
export class MyComponent {
constructor(private authService: UserAuthService) {}
handleLogin() {
this.authService.login(formValues.emailAddress, formValues.password)
.subscribe(res => {
console.log('Logged In');
}, err => {
console.log('Logging Failed');
// Global Error DOESN'T fire here as the Error has been handled
});
}
handleLoginPart2() {
this.authService.login(formValues.emailAddress, formValues.password)
.subscribe(res => {
console.log('Logged In');
}); // Global Error does fire here as the Error has NOT been handled
}
}
答案 0 :(得分:1)
我可以通过创建一个继承自HttpClient
的{{1}}来解决此问题。
通过这样做,我可以优雅地处理错误。
http-client.service.ts
Http