尝试/赶上 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-awaittry-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 可用吗?的主要内容,如果未能解决你的问题,请参考以下文章

NVRTC 对 Win32 不可用吗?

Xcode 不断提供 .signUp 仅在 iOS 13.2 中可用。这是一些 Xcode 错误吗?

蓝牙在 Mac 上不可用?7 方法尝试修复

有可用的聊天机器人框架吗? [关闭]

表格 enctype "application/json" 可用吗?

实现服务高可用奇淫技巧