Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
重定向自定义异常JavaScript_Javascript_Node.js_Typescript_Oop - Fatal编程技术网

重定向自定义异常JavaScript

重定向自定义异常JavaScript,javascript,node.js,typescript,oop,Javascript,Node.js,Typescript,Oop,我应该如何以正确的方式抛出异常,以便不丢失任何信息 考虑这个例子: try { this.stripe.customers.create({ ... }); } catch(e) { throw new MyCustomCreateCustomersException(); } 在本例中,我可以在日志中看到抛出了myCustomCreateCustomerException,以及抛出的位置。但是堆栈跟踪不包含任何关于抛出条带的信息,所以真正的错误在这里丢失了 我想这是很明显的,因为我遗

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

考虑这个例子:

try {
  this.stripe.customers.create({ ... });
} catch(e) {
  throw new MyCustomCreateCustomersException();
}
在本例中,我可以在日志中看到抛出了
myCustomCreateCustomerException
,以及抛出的位置。但是堆栈跟踪不包含任何关于抛出条带的信息,所以真正的错误在这里丢失了

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


myCustomCreateCustomerException
继承自
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'});
正因为如此,您才有了stacktrace、消息和其他信息。您可以随时添加元数据。在类型中对此类错误进行建模也很好:

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

由于该类型,您可以使用标准开关/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);
}
可能重复的