【问题标题】:Rethrowing custom exceptions JavaScript重新抛出自定义异常 JavaScript
【发布时间】:2020-02-18 07:09:06
【问题描述】:

我应该如何正确抛出异常,以免丢失任何信息?

考虑这个例子:

try {
  this.stripe.customers.create({ ... });
} catch(e) {
  throw new MyCustomCreateCustomersException();
}

在这种情况下,我可以在我的日志中看到MyCustomCreateCustomersException 被抛出以及在哪里抛出。但是该堆栈跟踪不包含任何有关 Stripe 抛出的任何内容,因此真正的错误在这里丢失了。

我想这很明显,因为我忽略了e 并且没有使用它,但我不确定使用它的最佳方法是什么?我也想有自定义例外,这似乎是一个很好的做法,但我不想丢失任何更深层次的信息。

MyCustomCreateCustomersException 继承自 Error

【问题讨论】:

标签: javascript node.js typescript oop


【解决方案1】:

我在这里提出的建议不是使用类,而是使用会创建所需错误结构的函数。所以我们不会丢失原始错误中的任何信息,但我们也可以添加一些元数据来表示特殊类型的错误。考虑

  // we are copying orginal error to not loose the data:
const createCustomerError = (e: Error) => ({...e, errorType: 'CREATE_CUSTOMER'});
const otherError = (e: Error) => ({...e, errorType: 'OTHER'});

感谢您拥有堆栈跟踪、消息以及其他信息。您可以随时添加元数据。也可以在类型中对此类错误进行建模:

type ErrorType = 'CREATE_CUSTOMER' | 'OTHER' // can be also enum
type MyError = {errorType: ErrorType } & Error;

// also we should define our error function output as MyError:
const createCustomerError = (e: Error): MyError => ({...e, errorType: 'CREATE_CUSTOMER'});
const otherError = (e: Error): MyError => ({...e, errorType: 'OTHER'});

由于该类型,您可以使用标准 switch/if 创建一个处理程序来处理特定错误,例如:

// some parent handler which will handle those re thrown errors
switch(error.errorType) {
  case 'CREATE_CUSTOMER': 
     someHandler();
     break;
  case 'OTHER': 
     someHandler2();
     break;
  default:
     defaultErrrorHandler();
}

最后但并非最不重要。使用函数错误构造函数如下所示:

try {
  this.stripe.customers.create({ ... });
} catch(e) {
  throw createCustomerError(e);
}

【讨论】:

    猜你喜欢
    • 2014-10-14
    • 2011-10-06
    • 2011-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多