在javascript中拦截并与自定义Error对象交互

问题描述 投票:0回答:1

我正在使用自定义的javascript模块,它有自己的Error对象。我想截取那些自定义的Error对象,并在我的try{} catch{}块中采用相应的路径,将它们与Javascript内置的Error对象(例如ReferenceErrorTypeError等)区分开来。

所以有点像这样。

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。所以问题是,我如何拦截那些错误对象?我确信我可以用字符串匹配来做,但只是想检查是否有更优雅的方式。

我试过的一件事,我有自己的errors模块,那里有一些自定义错误,我试图模仿模块的Error对象:

    class ExchangeError extends Error {
        constructor (message) {
            super (message);
            this.constructor = ExchangeError;
            this.__proto__   = ExchangeError.prototype;
            this.message     = message;
         }
     }

并通过我的errors模块导入,但这显然不起作用。

javascript error-handling exception-handling
1个回答
0
投票

通过实际实现我自己的ExchangeError我实际上做了非常糟糕的事情,我用我自己的instanceof使ExchangeError检查失明,而来自模块的ExchangeError实例不是我自己的ExchangeError的实例。这就是为什么我的if检查沉默。

解决方案就是这样做:

     const { ExchangeError } = require ('ccxt/js/base/errors');

从模块中导入错误。现在instanceof查找起作用了。我不知道可以从这样的模块中导入碎片。

感谢@FrankerZ指出这一点。

© www.soinside.com 2019 - 2024. All rights reserved.