Javascript ES5/ES6类和错误处理
比如说我有一节这样的课Javascript ES5/ES6类和错误处理,javascript,sentry,mobx-react,Javascript,Sentry,Mobx React,比如说我有一节这样的课 class SomeUIComponentDataStore { async function getUser() { try { //do something that can fail} catch(e) { // gracefully fail, setting portion of ui to fail state Sentry.captureException(e); //
class SomeUIComponentDataStore {
async function getUser() {
try { //do something that can fail}
catch(e) {
// gracefully fail, setting portion of ui to fail state
Sentry.captureException(e); // report to some metrics service
}
}
}
我对每个异步函数重复这种模式。在失败时,我响应错误,然后将其报告给某个服务(在本例中,该服务是Sentry)
我是否可以创建一个基类,它将自动用Sentry.caputreException()修饰我的catch语句。或者每次我看到错误时都必须手动写入 您可以使用
Sentry.captureException(e)创建一个基类代码>,然后具有用于自定义try/catch功能的可重写函数
class BaseClass {
function onGetUser() {
throw new Error("Method not implemented");
}
function onGetUserFail() {
throw new Error("Method not implemented");
}
async function getUser() {
try {
onGetUser();
} catch (e) {
onGetUserFail();
Sentry.captureException(e);
}
}
}
class SomeUIComponentDataStore extends BaseClass {
function onGetUser() {
// do something
}
function onGetUserFail() {
// do something
}
}
您可以定义一个decorator来重用该逻辑,并修饰可以抛出的方法:
function catchError(target, name, descriptor) {
const original = descriptor.value;
if (typeof original === 'function') {
descriptor.value = function(...args) {
try {
return original.apply(this, args);
} catch (e) {
Sentry.captureException(e); // report to some metrics service
}
}
}
}
function catchErrorAsync(target, name, descriptor) {
const original = descriptor.value;
if (typeof original === 'function') {
descriptor.value = async function(...args) {
try {
return await original.apply(this, args);
} catch (e) {
Sentry.captureException(e); // report to some metrics service
}
}
}
}
class SomeUIComponentDataStore {
@catchErrorAsync
async getUser() {
//do something that can fail
}
@catchError
otherMethod() {
//do something that can fail
}
}
我通常会在sentry调用中添加额外的日志记录,以便在错误中有更多数据,因为异常是无用的。你可以定义一些函数,但是你基本上写的是相同的东西,只是跳过了你要复制和粘贴的东西。我得到的错误消息实际上非常有用。所以我不介意只记录原始错误。就我而言,他们中的大多数人都来自firebase API,这不是我真正想要的。我想要的是一个可扩展类,它可以捕获任何错误并报告它。在不提前知道函数签名的情况下。哦,这看起来很完美。实际上我遇到了一个问题。实际上我遇到了一个问题,比如说我有以下代码:catchError decorator不再处理try时抛出的异常,catch block我更新了答案以处理异步情况,它有用吗?还没有时间去尝试。。。但是看起来不错。谢谢你的帮助。我们今天晚些时候会给你回复