Javascript Error 对象 和 错误处理

js 运行时产生错误,会抛出 Error 对象。也可以自行创建一个 Error 对象,比如

const err = new Error("出错了")

Error 属性

  • Error.prototype.message,错误消息。对于用户创建的 Error 对象,这是构造函数的第一个参数提供的字符串。
  • Error.prototype.name,错误名称。这是由构造函数决定的。
  • Error.prototype.cause,表示导致当前错误被抛出的原因——通常是另一个错误。对于用户创建的 Error 对象,这是构造函数的第二个参数提供的值。
  • Error.prototype.stack,一个非标准的属性,用于堆栈跟踪。
  • Error.prototype.fileName,一个非标准的 Mozilla 属性,用于表示引发此错误的文件的路径。
  • Error.prototype.lineNumber,一个非标准的 Mozilla 属性,用于表示引发此错误的代码所在的文件的行号。
  • Error.prototype.columnNumber,一个非标准的 Mozilla 属性,用于表示引发此错误的代码在文件中所在行的列号。

Error 实例方法

Error.prototype.toString(),返回表示该对象的字符串

err.toString()
// Error: 出错了

内置的错误类型

除了通用 Error 对象,JavaScript 还有其他类型的错误构造函数。

  • SyntaxError,语法错误
  • TypeError,变量或参数不属于有效类型
  • ReferenceError,无效引用
  • RangeError,数值变量或参数超出其有效范围
  • URIError,给 encodeURI() 或 decodeURI() 传递的参数无效
  • AggregateError,其中包裹了由一个操作产生且需要报告的多个错误。如:Promise.any() 产生的错误。
  • InternalError,创建一个代表 Javascript 引擎内部错误的异常抛出的实例。如:递归太多。
  • EvalError,与 eval() 有关。

自定义错误类型

class CustomError extends Error {
    constructor(...params) {
        super(...params);
        this.name = "CustomError";
    }
}

通过以下方法使用

throw new CustomError("自定义错误")

错误处理

可以用 throw 抛出一个 Error 对象,可以用 try……catch 来处理异常

try {
  throw new Error('出错了')
} catch (e) {
  console.error(e.name + ': ' + e.message)
}

throw 可以抛出 Error 对象,也可以抛出其他类型。

throw Symbol();
throw 123;
throw "Error!";
throw null;

处理某一类型的错误

你可以通过判断异常的类型来特定处理某一类的异常,即判断 constructor 属性,当使用现代 JavaScript 引擎时,可使用 instanceof 关键字:

try {
  foo.bar()
} catch (e) {
  if (e instanceof EvalError) {
    console.error(e.name + ': ' + e.message)
  } else if (e instanceof RangeError) {
    console.error(e.name + ': ' + e.message)
  }
  // ... etc

  else {
    // If none of our cases matched leave the Error unhandled
    throw e;
  }
}

区分相似的错误,通过 case 属性

有时,对于代码块的错误需要根据其原因进行不同的处理,但错误的原因又较为相似(例如:错误的类型和消息均相同)。

如果你无法控制原有错误的抛出,那么一种方法是捕获错误然后抛出一个新的错误,并在新的错误中给出更加具体的错误消息。原始错误应该被传递到新的 Error 的构造函数的 option 参数(cause 属性)中,这确保了原始的错误和堆栈追踪信息在上层的 try/catch 块中可用。

以下示例展示了两种方法会在失败时抛出相似的错误(doFailSomeWay() 和 doFailAnotherWay()):

function doWork() {
  try {
    doFailSomeWay();
  } catch (err) {
    throw new Error('Failed in some way', { cause: err });
  }
  try {
    doFailAnotherWay();
  } catch (err) {
    throw new Error('Failed in another way', { cause: err });
  }
}

try {
  doWork();
} catch (err) {
  switch(err.message) {
    case 'Failed in some way':
      handleFailSomeWay(err.cause);
      break;
    case 'Failed in another way':
      handleFailAnotherWay(err.cause);
      break;
  }
}

参考链接

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Error
Leave a Reply

Your email address will not be published. Required fields are marked *