适当的非字符串Javascript异常

Mik*_*maa 29 javascript exception-handling exception ecmascript-5

不知怎的,这不是50年编程语言发展的高潮:

  throw "My exception message here";
Run Code Online (Sandbox Code Playgroud)

在Javascript中执行异常的正确方法是什么呢?

  • 它们可以被识别(instanceof)

  • 除默认消息和堆栈跟踪外,它们还可以携带其他有效负载

  • 它们"子类化"基类Exception,因此调试控制台等可以提取有关异常的有意义信息

  • 可能的嵌套异常(将异常转换为另一个异常):如果需要捕获异常并重新抛出新异常,则会保留orignal堆栈跟踪,并且可以通过调试工具进行有意义的读取

  • 他们遵循Javascript最佳实践

Ray*_*nos 25

throw new Error("message");

或者如果您想更具体地使用其中一个错误对象

确保抛出真正的错误非常重要,因为它们包含堆栈跟踪.抛出一个字符串是愚蠢的,因为它没有附加任何元数据.

您还可以将错误子类化

// for some sensible implementation of extend 
// https://gist.github.com/1441105#file_1pd.js
var MyError = extend(Object.create(Error.prototype), {
   ...
});
Run Code Online (Sandbox Code Playgroud)

  • Javascript扩展对象模式是许多Javascript框架实现的常见设计模式,例如jQuery http://api.jquery.com/jQuery.extend/ (3认同)
  • 我认为扩展是一种模式,因为它通常以许多原型方式被利用,而不仅限于一个库/函数.一些框架也调用extend()函数. (3认同)

Sim*_*Sim 9

JavaScript中的基本"异常"是内置Error对象:

throw new Error("My exception message here");
Run Code Online (Sandbox Code Playgroud)

您可以将自定义例外定义为:

function CustomError(message) {
  this.message = message;
}

CustomError.prototype = new Error();
CustomError.prototype.constructor = CustomError;
Run Code Online (Sandbox Code Playgroud)

检查异常类型instanceof.还有一个方便的内置异常列表.

  • 避免在`CustomError`赋值中调用`new Error`,因为它调用`CustomError`上的构造函数,留下堆栈跟踪数据.赞成使用Prototypical扩展(`CustomError.prototype = Object.create(Error);`) (5认同)