【问题标题】:Try/catch oneliner available?尝试/赶上 oneliner 可用吗?
【发布时间】: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。

谢谢。

【问题讨论】:

    标签: javascript try-catch shorthand


    【解决方案1】:

    不,除了简单地删除所有换行符之外,没有“单行”版本的 try-catch。

    你为什么想要?垂直空间不会花费您任何费用。

    即使您愿意删除所有换行符,在我看来,这也更难阅读:

    try{t = 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"。

      【讨论】:

        猜你喜欢
        • 2019-01-21
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 2010-12-15
        • 1970-01-01
        • 1970-01-01
        • 2021-06-20
        • 1970-01-01
        相关资源
        最近更新 更多