当我做这样的事情时:
let resolved = null;
try {
resolved = require.resolve(modulePath)
} catch (e) {
}
我想知道是否有一个较短的语法,例如:
let resolved = null;
try resolved = require.resolve(modulePath)
有没有办法在不打开捕获块的情况下原谅这条线?
有些类似的东西,但我正在寻找更自然的东西:
function t (fn, def) {
let resolved = def;
try {
resolved = fn()
} catch (e) {
}
return resolved;
}
答案 0 :(得分:5)
否;有意使JavaScript try
块必须具有catch
或finally
。来自https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/try...catch#Description:
try
语句由一个try
块组成,该块包含一个或多个语句。即使对于单个语句,也必须始终使用{}
。必须存在至少一个catch
子句或finally
子句。
(请注意,try { ... } finally { }
没有catch
,它与您想要的内容在相反:您希望一切被捕获并吞没了,而try { ... } finally { }
却没有抓住任何东西。)
对于您而言,我认为最好的书写方式是:
let resolved;
try {
resolved = require.resolve(modulePath);
} catch (e) {
resolved = null;
}
这清楚表明resolved == null
是错误情况。
(更好的做法-添加一些逻辑以确保捕获到的异常确实是您所期望的异常。您可能不想静静地吞下意外错误所导致的异常!)
答案 1 :(得分:2)
有什么办法可以原谅这条线而又不会引起任何关注 阻止?
是的,如果您实现finally
子句。
除此之外,否。
尝试总是伴随着{strong> catch
或finally
。
答案 2 :(得分:0)
正如其他答复者已经指出的那样,您需要提供catch
或finally
。
顺便说一句,实现高阶函数有什么问题?
const valueOrNull = f => {
try {
return f ()
} catch (e) {
return null
}
}
const output1 = valueOrNull (() => { throw Error () })
const output2 = valueOrNull (() => "hello world")
console.log ('output1', output1)
console.log ('output2', output2)