制作函数中所需的参数

Making Params Required in Function

本文关键字:参数 函数      更新时间:2024-05-13

如果一个函数被调用,并且缺少正确执行被调用函数所需的参数,那么抛出错误是否是一种好的做法?

例如(在JavaScript中):

var sayHi = function(name) {
  console.log(name + ' says hi!');
}

与。

var sayHi = function(name) {
  if(!name) { throw new Error('param is missing'); }
  console.log(name + ' says hi!');
}  

对于第二个例子是一个好的编码实践,还是它只会增加不必要的膨胀,从而可能导致在一个横跨数十甚至数百个文件的更复杂的程序中经常出现不必要的错误,有强烈的意见吗?

您可以通过es6传递一个函数来实现这一点,该函数会立即抛出一个Error作为默认值

const err = msg => { throw Error( msg ) }
const sayHi = function(name = err('Name is undefined')) {
  console.log(name + ' says hi!');
}

这比在函数体中使用if语句的性能稍好,并提高了可读性。你可以做的另一个想法是构建一个做同样事情的装饰器。类似于:

@required( 'name')
const sayHi = function(name = err('Name is undefined')) {
  console.log(name + ' says hi!');
}

正如你在问题Is there a strong opinion中提到的,答案可能大多是固执己见的,所以在我看来,你应该始终有一个错误处理策略。无论是功能级别还是应用级别。在我看来,错误处理不太可能成为性能瓶颈。

第一件事:

这实际上取决于您决定是否应该使用throw异常,而不是return错误代码(或null,或其他什么)。

据我所知,只要处理得当,抛出异常而不是返回错误并没有什么大问题。

这就引出了以下问题:

何时正确抛出异常(或JS中的错误)?

这个问题非常棘手,这里应该标记并关闭为"主要基于意见",因为这取决于个人意见。。嗯,也许。。

类似的问题(嗯……这个确切的问题)已经在这里被问到并回答了,我发现自己同意公认的答案,总结如下:

没错!当且仅当函数前提条件(关于参数的假设)被破坏时,才会引发异常!–@Lightman

在您的情况下,如果违反了函数(预期参数)的假设:是,则抛出异常,因为JS没有提供任何语法构造来将函数参数设置为required


使用ES6,您可以使用default parameters强制执行您想要的行为:

function required() {
  throw new Error('Missing parameter');
}
function foo(aRequiredParameter = required()) {
  // Use your required parameter
  console.log("Hello " + aRequiredParameter);
}
// Hence:
foo("World") // OK
foo()        // -> Throws exception

示例取自此处,而在此处您可以找到有关此功能的更多示例。

这是可以实现的,因为当aRequiredParameter未被传递时,它的默认值将被分配(在本例中被调用),因此将抛出异常/错误。

这取决于情况。您几乎应该总是有某种错误处理,但什么类型的处理取决于情况。

有时只是抛出一个错误是可以的,其他时候如果你有错误,你可能想做点什么。

您可以使用类似try/catch的东西,或者,在这种情况下,只检查未定义的内容并使用它做一些事情。