初学Node,仿照写php的时候自定义异常类,捕获异常,然后判断异常是否属于自定义的异常。如果是属于自定义异常,则是客户端错误,如果不是自定义异常,则是服务器内部错误,然后记录日志。问题是在php中可以直接捕获异常,然后intanceof就行,可是在Node中,却无法使用代码:自定义异常类BaseException.js:class BaseException extends Error {
    constructor({code = 400, msg = "调用出错", errorCode = "10000"}) {
        super();
        this.code = code;
        this.msg = msg;
        this.errorCode = errorCode;
    }
}export default BaseException;继承至BaseException的子类ParamsException.js:
import BaseException from './BaseException';class ParamsException extends BaseException {
    constructor({code = 405, msg = "参数错误", errorCode = 40005}) {
        super({});
        this.code = code;
        this.msg = msg;
        this.errorCode = errorCode;
    }
}export default ParamsException;
捕获异常并且判断:
try {
            throw new ParamsException({});
        } catch (err) {
            if (err instanceof BaseException) {
                res.send('1111');
            } else {
                res.send({
                    code: 500,
                    msg: "服务器内部错误",
                    errorMsg: 50000
                });
            }
        }使用instanceof始终无法抛出正确的异常,这种情况是否是intanceof用法问题,有解决办法吗?

解决方案 »

  1.   

    nodejs,就是js, 这里的类,跟静态语言的类,不是一回事,你可以当他不存在,只以对象来理解就行了。既然学js,就请放弃对静态语言的迷恋和执着。并且一定要深刻理解js的作用域链的概念
      

  2.   

    但是在网上看了很多例子。他们也是用instanceof来判断是否属于自定义异常啊。intanceof本身也能判断一个示例和一个类之间是否存在继承关系啊。但是为什么我用在Error上就不对呢。找到一个同样办法的帖子,他也是这样用的。倒是他好像用着没问题。https://segmentfault.com/a/1190000017487731?utm_medium=referral&utm_source=tuicool还有PHP和Js应该都是动态语言
      

  3.   

    对不起,不了解php,只知道是用来做网站的,以为跟asp和jsp一样,是静态语言的服务端脚本。不过js的作用域链这个概念是真的重要,是理解js语言的一个核心点
      

  4.   

    问题解决了,最终原因是babel转化ES6的继承出现了问题,babel在处理Error,Array,Date三个类的继承的时候会出现(目前没搞明白)的问题。所以需要在babel的配置文件中加入插件babel-plugin-transform-b​​uiltin-extend,使用之后问题解决。所以这个问题不算是js继承的问题,而是babel的问题
      

  5.   

    prototype