@sentry/browser
@sentry/node
raven-js
raven-node
_(节点乌鸦)_@sentry/browser": "4.4.2"
大家好,
如上所述,我使用的是 Angular6 + Ngrx6。
我想要做的是当 webApp 调用 api 失败时向 Sentry 发送错误。
假设我调用了一个名为/abc/3
的 API,但它并不存在。
然后客户端收到404 Not Found
错误。
这是我想通过@sentry/browser
发送给 Sentry 的那个。
我创建了一个简单的服务。
@Injectable({
providedIn: 'root'
})
export class SentryService {
constructor() { }
captureException(error: any) {
Sentry.captureException(error.originalError || error);
throw error;
}
}
并创建了SentryErrorHandler
扩展了 Angular 的ErrorHandler
@Injectable()
export class SentryErrorHandler implements ErrorHandler {
constructor(private sentry: SentryService) {}
handleError(error: any): void {
this.sentry.captureException(error);
throw error;
}
}
此代码可以很好地检测到正常的 js 错误,例如abcdefg(); // <- this function doesn't exist so it occurs an error and sent to Sentry.
但是,我发现上面的代码没有检测到网络错误。 (就像我说/abc/3
)
所以我创建了ErrorInterceptor
,它扩展了 Angular 的HttpInterceptor
。
@Injectable()
export class ErrorInterceptor implements HttpInterceptor {
constructor(
private _injector: Injector,
private sentry: SentryService
) {}
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
return next.handle(req)
.pipe(
tap(event => {}, error => {
if (error) {
this.sentry.captureException(error);
}
})
);
}
}
然后我可以捕捉到网络错误。
但问题是我在 Sentry 仪表板中看不到任何内容。
我检查了我的 Chrome 网络标签。 我可以找到一条消息:
“使用键捕获的非错误异常:错误、标头、消息、名称、好的……”
所以我猜@sentry/browser 不认为这是一个错误。
我还发现了关于Non-Error exception captured with keys: error, headers, message, name, ok…
所以这是我的问题。
谢谢!
@Taewa Angular 抛出的错误对象与SentryEvent
的格式不同。
一种方法是将captureMessage(message: string)
与一些错误信息一起使用。 这也是我选择的更简单的方法: https ://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts
另一种方法是自己构建一个 Sentry 事件对象并使用captureEvent(event: SentryEvent)
方法将其发送到 Sentry。
希望这可以帮助。 🙂
谢谢@pascaliske
我实际上是通过使用您提到的captureMessage(message: string)
解决的。
这对未来的访客会有所帮助:)
关闭此问题,因为它似乎已解决。
最有用的评论
@Taewa Angular 抛出的错误对象与
SentryEvent
的格式不同。一种方法是将
captureMessage(message: string)
与一些错误信息一起使用。 这也是我选择的更简单的方法: https ://github.com/pascaliske/ngx-sentry/blob/master/projects/ngx-sentry/src/lib/sentry.interceptor.ts另一种方法是自己构建一个 Sentry 事件对象并使用
captureEvent(event: SentryEvent)
方法将其发送到 Sentry。希望这可以帮助。 🙂