适当的非字符串Javascript异常

时间:2012-01-29 15:17:18

标签: javascript exception exception-handling ecmascript-5

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

  throw "My exception message here";

在Javascript中执行异常的正确方法是什么,以便

  • 可以识别它们(instanceof)

  • 除了默认消息和堆栈跟踪

  • 之外,它们还可以携带其他有效负载
  • 他们“子类化”基本异常,以便调试控制台等可以提取有关异常的有意义信息

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

  • 他们遵循Javascript最佳做法

4 个答案:

答案 0 :(得分:25)

throw new Error("message");

或者如果您想更具体地使用其中一个Error Objects

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

您也可以将错误子类化

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

答案 1 :(得分:9)

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

throw new Error("My exception message here");

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

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

CustomError.prototype = new Error();
CustomError.prototype.constructor = CustomError;

使用instanceof检查例外类型。还有handy list of built-in exceptions

答案 2 :(得分:3)

你不能这样做,并满足问题的要求。

为什么?

问题是获得堆栈。本机错误对象(从现在开始为NativeError),在调用其构造函数时初始化堆栈。要获取MyError(您的错误子类)中的堆栈,您必须在MyError的构造函数中调用NativeConstructor。所以,你的MyError类看起来像这样:

function MyError(msg) {
    Error.call(this, msg);
}

但是,这不起作用。因为根据HTML5规范:

“如果将Error作为函数调用,则返回一个新的Error对象”。

而不是Error的构造函数很好并初始化您的自定义错误类,它会创建一个您没有用的错误对象。我还没有找到一种方法来调用NativeError构造函数并让它初始化MyError子类。

并非所有人都失去了。

如果我们放松原始的问题要求,并忘记“instanceof”来测试异常类(所以Java无论如何),并使用“name”代替,它可以完成。只需将MyError声明为:

function MyError(msg, customArg) {
    var e = new Error(msg);
    e.name = "MyError";
    e.custom = customArg;
    return e;
}

这就是我的工作。而不是打开“instanceof”,而是打开“name”。

答案 3 :(得分:2)

您可以通过调用Error constructor来创建Error对象。 error对象可以包含消息和名称。捕获时可以检查特定名称,也可以通过继承Error原型来创建自定义错误类型。这允许instanceof在不同的错误类型之间使用不同。

// Create a new object, that prototypally inherits from the Error constructor.  
function MyError(message) {  
    this.message = message || "Default Message";  
}  
MyError.prototype = new Error();  
MyError.prototype.constructor = MyError;  

try {  
    throw new MyError();  
} catch (e) {  
    console.log(e.name);     // "MyError"  
    console.log(e.message);  // "Default Message"  
}  

try {  
    throw new MyError("custom message");  
} catch (e) {  
    console.log(e.name);     // "MyError"  
    console.log(e.message);  // "custom message"  
}  

示例摘自:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error