如果调用函数并且缺少调用函数正确执行所必需的参数,那么抛出错误是一个好习惯吗?
例如(在JavaScript中):
var sayHi = function(name) {
console.log(name + ' says hi!');
}
VS
var sayHi = function(name) {
if(!name) { throw new Error('param is missing'); }
console.log(name + ' says hi!');
}
是否有强烈的意见,第二个例子是一个很好的编码实践,或者它是否只会增加不必要的膨胀,这可能导致频繁发生不必要的错误,这些错误会被包含在数十甚至数百个文件中的更复杂的程序中?
答案 0 :(得分:2)
你可以通过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
中提到的那样,答案只能是主要的,所以在我看来,你应该总是有一个错误处理策略。无论是功能杠杆还是应用程序级别。我不太可能认为错误处理将是您的性能瓶颈。
答案 1 :(得分:1)
第一件事:
由您决定应该或不应该throw
例外而不是return
错误代码(或null
或其他),这取决于您。
据我所知,只要您正确处理,就不会抛出异常而不是返回错误。
这导致了以下问题:
正确何时抛出异常(或JS中的错误)?
这个问题非常棘手,这里应该标记并关闭为“主要基于意见”,因为这取决于个人意见..好吧,也许..
类似的问题(嗯......这个确切的问题)已经被问及并回复here我发现自己同意接受的答案,在本评论中总结:
完全!当且仅当函数前提条件(关于参数的假设)被破坏时抛出异常! - @Lightman
在您的情况下,如果违反了函数的假设(您的预期参数):YES,抛出异常,因为JS没有提供任何语法构造来将函数参数设置为required
。
<小时/> 使用ES6,您可以使用
default parameters
来强制执行您想要的行为:
function missingParameterHandler() {
throw new Error('Missing parameter');
}
function foo(aRequiredParameter = missingParameterHandler()) {
// Use your required parameter
console.log("Hello " + aRequiredParameter);
}
// Hence:
foo("World") // OK
foo() // -> Throws exception
取自here的示例,而here您可以找到有关此功能的更多示例。
这是可以实现的,因为当aRequireParameter
未被传递时,将分配默认值(在这种情况下被调用),因此将抛出异常/错误。
答案 2 :(得分:0)
这取决于。你应该几乎总是有某种错误处理,但是什么类型的处理取决于具体情况。
有时候只是抛出一个错误就好了,有时候如果你有错误的话可能会想要做些什么。
您可以使用类似try / catch的东西,或者,在这种情况下,只需检查undefined并对其执行某些操作。