尝试/抓住可用的oneliner?

问题描述 投票:0回答:7

正如您可以转换以下内容:

var t;
if(foo == "bar") {
    t = "a";
} else {
    t = "b";
}

进入:

t = foo == "bar" ? "a" : "b";

,我想知道是否有速记/单行方法来转换它:

var t;
try {
    t = someFunc();
} catch(e) {
    t = somethingElse;
}

有没有一种方法可以用速记的方式做到这一点,最好是单行代码?当然,我可以删除换行符,但我的意思是类似

? :
的东西
if

谢谢。

javascript try-catch shorthand
7个回答
15
投票

您可以使用以下函数,然后使用它来连接您的 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;
} 

10
投票

有一个 liner 可用作 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
块包装一个函数,并使用解构来获取结果。

还有 一个想法 使用类似于 Go 风格的错误处理

// this is not real syntax
const [error, result] = try parse('hello');

9
投票

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

try
-
catch

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

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

try{t = someFunc();}catch(e){t = somethingElse;}

比这个:

try {
    t = someFunc();
} catch(e) {
    t = somethingElse;
}

你拥有的一切都很好。可读的代码应该是优先考虑的。即使这意味着更多的打字。


7
投票

你可以把它减少到两行。

try { doSomething(); }
catch (e) { handleError(); }

或者,在您的具体示例中,3 行。

var t;
try { t = doSomething(); }
catch (e) { t = doSomethingElse(); }

无论哪种方式,如果您的代码允许,在我看来,两行代码比典型的 try/catch 块要简洁得多。


2
投票

虽然这对您关于速记的问题没有帮助,但如果您正在寻求在需要表达式的内联上下文中工作的 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"


1
投票

这里只使用js:

const result = (()=>{ try{ return fn(); } catch(e) { return "other"; } })();

const badFn = ()=>{ return JSON.parse("broken json"); }
const result = (()=>{ try{ return badFn(); } catch(e) { return "other"; } })();
console.log(result);


0
投票

有草案和提案,它们将完全按照您想要的方式进行。它称为安全赋值运算符 (?=)。

语法为:

const t ?= someFunc() || somethingElse;

const [error, t] ?= someFunct();

请参阅:dev.to - JavaScript 中的轻松错误处理:安全赋值运算符如何简化您的代码Medium - JavaScript 安全赋值运算符 (?=):完整指南

并且您已经可以使用类似的包:https://www.npmjs.com/package/with-error

关注他们的进展。我也很期待:)

© www.soinside.com 2019 - 2024. All rights reserved.