尝试/赶上 oneliner 可用吗?
Posted
技术标签:
【中文标题】尝试/赶上 oneliner 可用吗?【英文标题】:Try/catch oneliner available? 【发布时间】:2011-07-04 20:04:24 【问题描述】:就像您可以转换以下内容一样:
var t;
if(foo == "bar")
t = "a";
else
t = "b";
进入:
t = foo == "bar" ? "a" : "b";
,我想知道是否有一种速记/单行方式来转换它:
var t;
try
t = someFunc();
catch(e)
t = somethingElse;
有没有一种速记的方法,最好是oneliner?当然,我可以只删除换行符,但我的意思是类似于 ? :
之类的 if
。
谢谢。
【问题讨论】:
【参考方案1】:不,除了简单地删除所有换行符之外,没有“单行”版本的 try
-catch
。
你为什么想要?垂直空间不会花费您任何费用。
即使您愿意删除所有换行符,在我看来,这也更难阅读:
tryt = someFunc();catch(e)t = somethingElse;
比这个:
try
t = someFunc();
catch(e)
t = somethingElse;
你所拥有的一切都很好。可读的代码应该是一个优先事项。即使这意味着更多的打字。
【讨论】:
好吧,那就可惜了。我只是想知道,因为对于一个简单的if
块,我更喜欢? :
行,因为它更清晰,打字更少。所以也许try catch
有类似的东西,但显然没有。
@pimvdb: if
是一个语句,?:
是一个表达式。尽管可以以相似的方式使用它们,但它们是不同的。
我知道可读性更重要,但如果有 简写 try catch
表达式,我认为这将更具可读性。但我会忘记它,因为它不存在。 @Gumbo:我没有意识到这一点,因为它的行为相似。谢谢。
“垂直空间不会花费你任何东西”:不是真的,视觉噪音、滚动、人类解析的时间是真正的成本,尤其是当他们最初寻找主要执行路径时,而不是错误处理。大多数 IDE 折叠 Java 的导入是有充分理由的。【参考方案2】:
你可以把它简化为两行。
try doSomething();
catch (e) handleError();
或者,在您的具体示例中,3 行。
var t;
try t = doSomething();
catch (e) t = doSomethingElse();
无论哪种方式,如果您的代码允许,IMO 两行代码比典型的 try/catch 块要简洁得多。
【讨论】:
你可以把它降到一行...try doSomething(); catch (e) handleError();
这似乎是最干净的解决方案,谢谢。 @Leigh:老实说,这又不太干净。实际上,我正在寻找类似 @987654324@ 的东西,这意味着你使用的东西。
@Leigh:OP 知道您可以通过删除换行符使其成为单行。 OP 询问是否有一个内置的语言结构是 try..catch
的简写。
我非常清楚它不太干净。我想我的意思是:说“你可以把它降到两行”有什么意义,这就像说你可以把它降到一个一样明显。
我绝对更喜欢“双线”方法。它很干净,仍然易于阅读。【参考方案3】:
您可以使用以下函数,然后使用它来使您的 try/catch 连线。它的使用会受到限制,并且会使代码更难维护,所以我永远不会使用它。
var v = tc(MyTryFunc, MyCatchFunc);
tc(function() alert('try'); , function(e) alert('catch'); );
/// try/catch
function tc(tryFunc, catchFunc)
var val;
try
val = tryFunc();
catch (e)
val = catchFunc(e);
return val;
【讨论】:
这是“我永远不会使用它”的赞成票【参考方案4】:有一个可用作 npm 包 try-catch 的衬垫。你可以这样使用它:
const tryCatch = require('try-catch');
const parse = JSON;
const [error, result] = tryCatch(parse, 'hello');
async-await
try-to-catch也有类似的方法:
const readFile = require('fs').promises;
read('./package.json').then(console.log);
async function read(path)
const [error, data] = await tryToCatch(readFile, path, 'utf8');
return data || error.message;
所有这些包装器所做的只是用try-catch
块包装一个函数并使用解构来获取结果。
还有an idea可以使用类似于Go style error handling的东西:
// this is not real syntax
const [error, result] = try parse('hello');
【讨论】:
【参考方案5】:虽然这对您关于速记的问题没有帮助,但如果您正在寻求让 try-catch 在需要表达式的内联上下文中工作(与语句不同,正如 try-catch 使用的那样),它可能会有所帮助。
您可以通过将 try-catch 包装到 IIFE 中来实现这一点,虽然它是一个表达式,但您可以在其中添加立即执行的语句:
var t, somethingElse;
var failingCondition = false;
var result = failingCondition || (function ()
try
t = someFunc();
catch(e)
t = somethingElse;
)();
以上内容可能没什么用,但您也可以有条件地返回值:
var t, somethingElse;
var failingCondition = false;
var result = failingCondition || (function ()
try
t = someFunc();
return 'someFunc';
catch(e)
t = somethingElse;
return 'somethingElse';
)();
由于someFunc()
在这里失败(在我们的例子中,因为它没有定义),result
将等于"somethingElse"
。
【讨论】:
以上是关于尝试/赶上 oneliner 可用吗?的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 不断提供 .signUp 仅在 iOS 13.2 中可用。这是一些 Xcode 错误吗?