当前位置: 首页 > 面试题库 >

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

花阳秋
2023-03-14
问题内容

出于某种原因,在以下代码段中似​​乎无法使用构造函数委托:

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

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

运行此给出The message is:''。关于为什么的任何想法,或者是否有更好的方法来创建新的Error子类?我不知道apply的本地Error构造函数存在问题吗?


问题答案:

更新您的代码以将原型分配给Error.prototype和instanceof以及您的assert工作。

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

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

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

根据评论进行编辑

在查看了注释并试图记住为什么要分配原型Error.prototype而不是new Error()像Nicholas
Zakas在他的文章中所做的那样之后,我使用以下代码创建了一个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()是创建的行号,而不是throwe发生的行号。但是,这可能比具有NotImplementedError.prototype.name = "NotImplementedError"影响Error对象的线的副作用更好。

另外,请注意NotImplementedError2,当我没有.name明确设置时,它等于“错误”。但是,如评论中所述,因为该版本将原型设置为newError(),所以我可以进行设置NotImplementedError2.prototype.name ="NotImplementedError2"并确定。



 类似资料:
  • 问题内容: 我不知道最好的方法是创建具有属性和方法的JavaScript对象。 我看过一些示例,该示例中的人员使用然后在所有功能中使用以确保范围始终正确。 然后,我看到了用于添加属性的示例,而其他示例则是内联的。 有人可以给我一个带有某些属性和方法的JavaScript对象的正确示例吗? 问题答案: 有两种用于在JavaScript中实现类和实例的模型:原型方式和闭包方式。两者都有优点和缺点,并且

  • 问题内容: 我需要做的就是在当前函数执行结束时执行一个回调函数。 此功能的使用者应如下所示: 我该如何实施? 问题答案: 实际上,您的代码将按原样工作,只需将回调声明为参数即可,您可以使用参数名称直接调用它。 基础知识 那会叫,这会叫,这会提醒“东西在这里”。 请注意,传递函数 引用 ()而不是调用函数并传递其结果()非常重要。在您的问题中,您可以正确执行此操作,但是值得指出,因为这是一个常见错误

  • 问题内容: 我正在尝试在Log4j2中编写自己的RewritePolicy。该文档指出: RewritePolicy是一个接口,允许实现在将LogEvent传递给Appender之前检查并可能对其进行修改。RewritePolicy声明一个必须执行的名为rewrite的方法。该方法通过LogEvent传递,并且可以返回相同事件或创建一个新事件。 这是我的 java类 : 这是我的 yaml配置 文

  • 问题内容: 我正在http://www.cafeaulait.org/javafaq.html上阅读#6.10项,然后我开始怀疑大型企业如何创建自己的JVM实现。一个人会尝试(或可行)实验性的东西吗? 问题答案: 从技术上讲,创建该新JVM所需的所有信息都是该语言和目标平台的公共规范。即使字节码解释在很大程度上相同,JVM还是需要根据其是要在台式机还是手机上运行而有所不同。 一些开始寻找信息的地方

  • 问题内容: 我正在尝试在javaFX中创建自定义光标。这是我的代码: Windows 8.1的游标创建无效吗? 问题答案: 检出ImageCursor.getBestSize()方法和ImageCursor.getMaximumColors()并查看它们返回的内容,然后尝试匹配最佳大小和最大颜色的自定义光标图像。对于Windows 8.1,这很可能是32x32的光标。 这是来自javadoc 的引

  • 问题内容: 如何在Java中创建自定义异常? 问题答案: 要定义受检查的异常,请创建的子类(或子类的层次结构)。例如: 可能引发或传播此异常的方法必须声明它: …,并且调用此方法的代码必须处理或传播此异常(或同时处理): 你会在上面的示例中注意到该错误IOException已被捕获并重新抛出为。这是用于封装异常的常用技术(通常在实现API时)。 有时在某些情况下,你不想强制每个方法在其throws