@sentry/browser
@sentry/node
raven-js
raven-node
_ (غراب للعقدة) _@sentry/browser": "4.4.2"
أهلا بكم،
كما وصفت أعلاه ، أنا أستخدم Angular6 + Ngrx6.
ما أريد القيام به هو إرسال خطأ إلى Sentry عندما يفشل تطبيق الويب في استدعاء api.
دعنا نقول ، أنا اتصل بواجهة برمجة تطبيقات تسمى /abc/3
وهي غير موجودة.
ثم يحصل العميل على خطأ 404 Not Found
.
وهذا هو الذي أريد إرساله إلى Sentry من خلال @sentry/browser
.
لقد أنشأت خدمة بسيطة.
@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);
}
})
);
}
}
ثم يمكنني التقاط خطأ الشبكة.
لكن المشكلة هي أنني لا أستطيع رؤية أي منها في لوحة أجهزة القياس الخاصة بي.
لقد تحققت من علامة تبويب شبكة Chrome. ويمكنني أن أجد رسالة:
"تم تسجيل استثناء غير خطأ بواسطة المفاتيح: خطأ ، رؤوس ، رسالة ، اسم ، حسنًا ..."
لذلك أعتقد أن @ sentry / المتصفح لا يعتقد أن هذا خطأ.
اكتشفت أيضًا أن الحديث عن 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.
أتمنى أن يساعدك هذا. 🙂
شكرا @ باسكاليسكي
لقد قمت بحلها بالفعل باستخدام 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.أتمنى أن يساعدك هذا. 🙂