Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如果错过了一个重要的构造函数参数,应该怎么办?_Javascript - Fatal编程技术网

Javascript 如果错过了一个重要的构造函数参数,应该怎么办?

Javascript 如果错过了一个重要的构造函数参数,应该怎么办?,javascript,Javascript,我用es6创建了一个类,它需要在选项参数中定义一个属性 class MyClass{ constructor(options){ if(typeof options.name === "undefined") console.error("MyClass.constructor: options.name is not defined"); return this; } } 我可以记录错误,但我不希望此类的用户继续

我用es6创建了一个类,它需要在
选项
参数中定义一个属性

class MyClass{
     constructor(options){
         if(typeof options.name === "undefined")
            console.error("MyClass.constructor: options.name is not defined");
         return this;
     }
}

我可以记录错误,但我不希望此类的用户继续。我该退什么?是否仍应返回该类的实例?

在这种情况下,我将抛出一个错误。我会这样做:

class MyClass{
     constructor(options){
         if(typeof options.name === "undefined")
            throw new Error("MyClass.constructor: options.name is not defined");
         return this;
     }
}

你可以阅读更多关于投掷和投掷的信息。是类似的SO Q&a。

如果选项中没有太多属性,我可能会定义一个默认值,这样我就不必抛出错误或阻止代码继续

class A {
  constructor({ name = 'Andy', age }) {
    console.log(name, age) // Andy, 20
  }
}

var a = new A({ age: 20 });

如果要抛出,则应使用适当的错误类型,以便界面用户可以采取正确的操作。包括文件名和尽可能多的详细信息。您希望尽可能地帮助API用户

class MyClass{
   constructor ( options ) {
       if(options === undefined || options === null) {
           throw new ReferenceError("MyClass constructor missing required argument `options`.", "filename.js");
       } else
       if(options.name === undefined) {
           throw new ReferenceError("MyClass constructor missing required property `options.name`.", "filename.js");
       } else
       if( typeof options.name !== "string") {
            throw new TypeError("Argument `options.name` should be a string.","filename.js"); 
       } else 
       if( options.name === "" || options.name.trim() === ""){
            throw new RangeError("Argument `options.name` has an invalid value. It requiers one or more alphaNumeric chanracters.","filename.js");
       } else
       if( options.name.length < 5 ){
            console.warning("MyClass constructor. It is recogmended that 'options.name' has more than 5 characters");
       }
       ... all good continue construction
   }
}
class-MyClass{
构造函数(选项){
如果(选项===未定义| |选项===空){
抛出新引用错误(“MyClass构造函数缺少必需的参数`options`.”,“filename.js”);
}否则
如果(options.name==未定义){
抛出新的引用错误(“MyClass构造函数缺少必需的属性`options.name`.”,“filename.js”);
}否则
if(typeof options.name!=“字符串”){
抛出新类型错误(“参数`options.name`应该是字符串。”,“filename.js”);
}否则
如果(options.name==“”| | options.name.trim()==“”){
抛出新的RangeError(“参数`options.name`的值无效。它需要一个或多个字母数字字符。”,“filename.js”);
}否则
如果(options.name.length<5){
console.warning(“MyClass构造函数。注意“options.name”超过5个字符”);
}
…一切都好,继续施工
}
}

这样,程序员可以选择做什么。它可能需要额外的客户端输入(输入错误的表单),以允许应用程序重试。或者,可以将错误传递给报告接口,该接口可以记录更严重的问题。我们必须始终提供一切机会来解决问题,并提供尽可能多的信息。没有什么比非描述性泛型错误更糟糕的了,使用API的人最不想做的事情就是深入其中,找出发生了什么以及如何克服错误(如果有办法)。

我自己也会抛出一个异常。。。这是否意味着创建此类的每个人都需要将其包装在try/catch中?不。JS异常是未检查的,就像java中的RuntimeExceptions一样。我会退出程序并尝试修复代码,我是认真的x-)我的意思是,在这种情况下,可能存在设计问题。