不知怎的,这不是50年编程语言发展的高潮:
throw "My exception message here";
在Javascript中执行异常的正确方法是什么,以便
可以识别它们(instanceof)
除了默认消息和堆栈跟踪
他们“子类化”基本异常,以便调试控制台等可以提取有关异常的有意义信息
可能的嵌套异常(将异常转换为另一个异常):如果需要捕获异常并重新抛出新异常,则将保留orignal堆栈跟踪,并且可以通过调试工具有意义地读取
他们遵循Javascript最佳做法
答案 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