gpt4 book ai didi

javascript - 重新抛出自定义异常 JavaScript

转载 作者:行者123 更新时间:2023-11-30 06:11:45 25 4
gpt4 key购买 nike

我应该如何以正确的方式抛出异常才不会丢失任何信息?

考虑这个例子:

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

在这种情况下,我可以在我的日志中看到抛出 MyCustomCreateCustomersException 以及抛出的位置。但是那个堆栈跟踪不包括任何关于 Stripe 抛出的任何东西,所以真正的错误在这里丢失了。

我想这有点明显,因为我遗漏了 e 并且没有使用它,但我不确定使用它的最佳方式是什么?我也想有自定义异常,这似乎是一个好习惯,但我不想在更深层次上丢失任何信息。

MyCustomCreateCustomersException 继承自 Error

最佳答案

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

  // 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);
}

关于javascript - 重新抛出自定义异常 JavaScript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58499086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com