我正在尝试使用角度为6的以下类来处理http错误.我从服务器获得了401 unAuthorized状态.但是,我没有看到控制台错误消息.
HttpErrorsHandler.ts文件
import { ErrorHandler, Injectable} from '@angular/core';
@Injectable()
export class HttpErrorsHandler implements ErrorHandler {
handleError(error: Error) {
// Do whatever you like with the error (send it to the server?)
// And log it to the console
console.error('It happens: ', error);
}
}
Run Code Online (Sandbox Code Playgroud)
app.module.ts文件
providers: [{provide: ErrorHandler, useClass: HttpErrorsHandler}],
Run Code Online (Sandbox Code Playgroud)
HttpCallFile
import { Injectable , Component} from '@angular/core';
import { HttpClient, HttpHeaders } from "@angular/common/http";
import { Observable } from 'rxjs';
import {AuthServiceJwt} from '../Common/sevice.auth.component';
@Injectable()
export class GenericHttpClientService …Run Code Online (Sandbox Code Playgroud) typescript angular-routing angular angular6 angular-errorhandler
我有这样定义的全局错误处理程序(清除了简化/专有信息):
export class ErrorsHandler extends CommonBase implements ErrorHandler {
constructor(protected loggingService: LoggingService,
private coreService: CoreService {
super(loggingService);
}
handleError(error: Error) {
if (error && error.stack && (error.stack.indexOf(Constants.PACKAGE_NAME) >= 0)) {
this.logSystemError(error, true);
this.coreService.showSystemError(error, this.owner);
}
else {
// Rethrow all other errors.
throw error;
}
}
Run Code Online (Sandbox Code Playgroud)
并且在我的模块(并且只有我的模块)中,它被注册为提供者,如下所示:
export function errorHandlerFactory(loggingService: LoggingService, coreService: CoreService) {
return new ErrorsHandler(loggingService, coreService);
}
providers: [
{ provide: ErrorHandler, useFactory: errorHandlerFactory, deps: [LoggingService, CoreService] }
]
Run Code Online (Sandbox Code Playgroud)
我的模块被其他人使用,我们一起组成了一个大型应用程序。我的问题是,即使我尝试过滤仅与我的模块/软件包相关的那些脚本,也会捕获到所有脚本错误,因为过滤是在中完成的handleError()。即使我重新抛出了与我无关的错误(在else上面),其他模块/程序包的开发人员仍在抱怨我在全球范围内捕获所有内容,并且重新抛出的错误已经失去了某些上下文/信息。
所以问题是,是否有可能以某种方式限制我的错误处理程序的范围,以仅捕获和处理源自我的模块/包的脚本错误(而完全忽略应用程序中的所有其他脚本错误)?
经过大量的搜寻之后,我唯一想到的替代方法是将try/catch其放置在任何地方,这是我想尽可能避免的方法。
error-handling typescript angular angular-errorhandler angular7
我有一个带有 globalError 处理程序的应用程序,如下所示:
import { Injectable, ErrorHandler, Injector } from "@angular/core";
import { Router } from "@angular/router";
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
constructor(
private injector: Injector) { }
public handleError(error: any) {
console.error("Something went wrong");
//.. Handle error here
}
}
Run Code Online (Sandbox Code Playgroud)
这总是适用于每个星座。如果抛出错误,全局处理程序会捕获并处理它。
现在升级到 RxJs 6.2.2 后,我明白捕捉 http 错误发生了变化。
代码错误仍然有效,但 HttpClient 抛出的错误不会被全局捕获。GlobalErrorHandler 不再被触发。
我知道我可以处理我的服务中的错误,并且工作正常:
doSomething() {
return this.http
.get("http://someURL").pipe(
map((res: any) => { console.log(res) }),
catchError(this.handleError<any>(`blabla`))
);
}
/**
* Handle Http operation that failed.
* Let the app …Run Code Online (Sandbox Code Playgroud) 我在 Angular(版本 5.2.0)中为所有未处理的异常实现了一个全局错误处理程序。
全局错误处理程序如下所示:
import { Router } from '@angular/router';
import { ErrorHandler, Injectable, Injector, NgZone } from '@angular/core';
import { LoggingService } from '../services/logging.service';
@Injectable()
export class GlobalErrorHandler implements ErrorHandler {
private router: Router;
constructor(injector: Injector, private zone: NgZone, private loggingService: LoggingService) {
setTimeout(() => {
this.router = injector.get(Router);
});
}
handleError(error) {
this.loggingService.logErrorToApi(error);
this.zone.run(() => this.router.navigate(['/error']));
}
}
Run Code Online (Sandbox Code Playgroud)
仅当我有电话时,路由才有效this.zone.run(...)。如果我删除此调用,路由只会将路由添加error到 URL,并且不会显示组件。ngOnInit 也没有被调用。
如果我必须使用这样的“黑客”来让我的路由对我起作用,那么我的应用程序中的某个地方似乎配置错误。
有人知道我需要更改什么才能使其在没有区域呼叫的情况下运行吗?
我的路线:
const appRoutes: Routes = [
{
path: 'error',
component: ErrorComponent …Run Code Online (Sandbox Code Playgroud)