首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >处理JavaScript中的特定错误(考虑异常)

处理JavaScript中的特定错误(考虑异常)
EN

Stack Overflow用户
提问于 2009-09-16 23:00:25
回答 5查看 81.8K关注 0票数 135

您将如何实现不同类型的错误,以便能够捕获特定的错误并让其他错误浮现出来?

实现这一点的一种方法是修改Error对象的原型:

代码语言:javascript
复制
Error.prototype.sender = "";


function throwSpecificError()
{
    var e = new Error();

    e.sender = "specific";

    throw e;
}

捕获特定错误:

代码语言:javascript
复制
try
{
    throwSpecificError();
}

catch (e)
{
    if (e.sender !== "specific") throw e;

    // handle specific error
}

你们还有别的选择吗?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-09-16 15:09:17

要创建自定义异常,可以从Error对象继承:

代码语言:javascript
复制
function SpecificError () {

}

SpecificError.prototype = new Error();

// ...
try {
  throw new SpecificError;
} catch (e) {
  if (e instanceof SpecificError) {
   // specific error
  } else {
    throw e; // let others bubble up
  }
}

在不继承Error的情况下,最简单的方法可能是抛出一个具有名称和消息属性的简单对象:

代码语言:javascript
复制
function throwSpecificError() {
  throw {
    name: 'SpecificError',
    message: 'SpecificError occurred!'
  };
}


// ...
try {
  throwSpecificError();
} catch (e) {
  if (e.name == 'SpecificError') {
   // specific error
  } else {
    throw e; // let others bubble up
  }
}
票数 201
EN

Stack Overflow用户

发布于 2009-09-16 15:08:22

正如在下面的注释中所指出的,这是特定于Mozilla的,但您可以使用“conditional catch”块。例如:

代码语言:javascript
复制
try {
  ...
  throwSpecificError();
  ...
}
catch (e if e.sender === "specific") {
  specificHandler(e);
}
catch (e if e.sender === "unspecific") {
  unspecificHandler(e);
}
catch (e) {
  // don't know what to do
  throw e;
} 

这提供了更类似于Java中使用的类型化异常处理的东西,至少在语法上是这样。

票数 16
EN

Stack Overflow用户

发布于 2019-11-28 06:21:38

用于导出使用的模块

代码语言:javascript
复制
/**
 * Custom InputError
 */
class InputError extends Error {
  /**
   * Create InputError
   * @param {String} message
   */
  constructor(message) {
    super(message);
    this.name = this.constructor.name;
    Error.captureStackTrace(this, this.constructor);
  }
}

/**
 * Custom AuthError
 */
class AuthError extends Error {
  /**
   * Create AuthError
   * @param {String} message
   */
  constructor(message) {
    super(message);
    this.name = this.constructor.name;
    Error.captureStackTrace(this, this.constructor);
  }
}

/**
 * Custom NotFoundError
 */
class NotFoundError extends Error {
  /**
   * Create NotFoundError
   * @param {String} message
   */
  constructor(message) {
    super(message);
    this.name = this.constructor.name;
    Error.captureStackTrace(this, this.constructor);
  }
}

module.exports = {
  InputError: InputError,
  AuthError: AuthError,
  NotFoundError: NotFoundError
};

导入到脚本中:

代码语言:javascript
复制
const {InputError, AuthError, NotFoundError} = require(path.join(process.cwd(), 'lib', 'errors'));

使用:

代码语言:javascript
复制
function doTheCheck = () =>
  checkInputData().then(() => {
    return Promise.resolve();
  }).catch(err => {
    return Promise.reject(new InputError(err));
  });
};

外部调用代码:

代码语言:javascript
复制
doTheCheck.then(() => {
  res.send('Ok');
}).catch(err => {
  if (err instanceof NotFoundError) {
    res.status(404).send('Not found');
  } else if (err instanceof AuthError) {
    res.status(301).send('Not allowed');
  } else if (err instanceof InputError) {
    res.status(400).send('Input invalid');
  } else {
    console.error(err.toString());
    res.status(500).send('Server error');
  }
});
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1433558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档