gpt4 book ai didi

javascript - 如何在 JavaScript 中创建自定义错误?

转载 作者:IT老高 更新时间:2023-10-28 13:14:41 24 4
gpt4 key购买 nike

由于某种原因,构造函数委托(delegate)在以下代码段中似​​乎不起作用:

function NotImplementedError() { 
Error.apply(this, arguments);
}
NotImplementedError.prototype = new Error();

var nie = new NotImplementedError("some message");
console.log("The message is: '"+nie.message+"'")

运行它会给出 消息是:''。关于原因的任何想法,或者是否有更好的方法来创建新的 Error 子类? apply 到我不知道的原生 Error 构造函数是否有问题?

最佳答案

更新您的代码以将您的原型(prototype)分配给 Error.prototype 并且 instanceof 和您的断言工作。

function NotImplementedError(message = "") {
this.name = "NotImplementedError";
this.message = message;
}
NotImplementedError.prototype = Error.prototype;

但是,我只会抛出您自己的对象并检查 name 属性。

throw {name : "NotImplementedError", message : "too lazy to implement"}; 

根据评论编辑

在查看评论并试图记住为什么我会将原型(prototype)分配给 Error.prototype 而不是像 Nicholas Zakas 在他的 article 中所做的那样的 new Error() , 我创建了一个 jsFiddle使用以下代码:

function NotImplementedError(message = "") {
this.name = "NotImplementedError";
this.message = message;
}
NotImplementedError.prototype = Error.prototype;

function NotImplementedError2(message = "") {
this.message = message;
}
NotImplementedError2.prototype = new Error();

try {
var e = new NotImplementedError("NotImplementedError message");
throw e;
} catch (ex1) {
console.log(ex1.stack);
console.log("ex1 instanceof NotImplementedError = " + (ex1 instanceof NotImplementedError));
console.log("ex1 instanceof Error = " + (ex1 instanceof Error));
console.log("ex1.name = " + ex1.name);
console.log("ex1.message = " + ex1.message);
}

try {
var e = new NotImplementedError2("NotImplementedError2 message");
throw e;
} catch (ex1) {
console.log(ex1.stack);
console.log("ex1 instanceof NotImplementedError2 = " + (ex1 instanceof NotImplementedError2));
console.log("ex1 instanceof Error = " + (ex1 instanceof Error));
console.log("ex1.name = " + ex1.name);
console.log("ex1.message = " + ex1.message);
}

控制台输出是这样的。

undefined
ex1 instanceof NotImplementedError = true
ex1 instanceof Error = true
ex1.name = NotImplementedError
ex1.message = NotImplementedError message
Error
at window.onload (http://fiddle.jshell.net/MwMEJ/show/:29:34)
ex1 instanceof NotImplementedError2 = true
ex1 instanceof Error = true
ex1.name = Error
ex1.message = NotImplementedError2 message

这证实了我遇到的“问题”是错误的堆栈属性是创建 new Error() 的行号,而不是 throw e 发生。但是,这可能比具有影响 Error 对象的 NotImplementedError.prototype.name = "NotImplementedError" 行的副作用更好。

另外,请注意 NotImplementedError2,当我没有明确设置 .name 时,它等于“错误”。但是,正如评论中提到的,因为该版本将原型(prototype)设置为 new Error(),所以我可以设置 NotImplementedError2.prototype.name = "NotImplementedError2" 并且没问题。

关于javascript - 如何在 JavaScript 中创建自定义错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/783818/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com