我正在使用具有自己的Error
对象的自定义javascript模块。我想拦截那些自定义的Error对象,并在try{} catch{}
块中采用适当的路径,以将它们与Javascript内置的Error对象(例如ReferenceError
,TypeError
等)区分开来。
有点像这样。
try {
// Some code that might produce a traditional javascript error
// or one of the errors raised by the module I am using.
}catch (error){
if(error instanceof ExchangeError){
// Handle this in a way.
}else{
// Probably one of the built in Javascript errors,
// So do this other thing.
}
}
因此,在上面的示例中,
ExchangeError
是属于该特定模块的自定义错误,但是,尽管我执行instanceof
时会得到error.constructor.name
,但我无法针对我的错误运行ExchangeError
。我的JavaScript范围根本不了解
ExchangeError
。所以问题是,如何截获这类Error对象?我敢肯定我可以通过字符串匹配来做到这一点,但是只是想检查一下是否有更优雅的方法。我尝试过的一件事是,我有自己的
errors
模块,其中存在一些自定义错误,我试图模仿该模块的Error对象: class ExchangeError extends Error {
constructor (message) {
super (message);
this.constructor = ExchangeError;
this.__proto__ = ExchangeError.prototype;
this.message = message;
}
}
并通过我的
errors
模块导入它,但这显然没有用。 最佳答案
通过实际实现自己的ExchangeError
,我实际上所做的事情确实非常糟糕,我用自己的instanceof
遮盖了ExchangeError
检查,而来自模块的ExchangeError
实例并不是我自己的ExchangeError的实例。这就是为什么我的if
检查变得沉默的原因。
解决方案就是这样做:
const { ExchangeError } = require ('ccxt/js/base/errors');
从模块内部导入错误。现在,
instanceof
查找正在工作。我不知道有人可以从这样的模块中导入点点滴滴。感谢@FrankerZ指出这一点。