javascript 试乘/搭乘一条可用的线路?

qgelzfjb  于 2023-02-07  发布在  Java
关注(0)|答案(6)|浏览(127)

就像您可以转换以下内容一样:

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? :的东西。
谢谢。

ldxq2e6h

ldxq2e6h1#

你可以使用下面的函数,然后用它来online你的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;
}
cgvd09ve

cgvd09ve2#

不,try-catch没有“一行”版本,只是简单地删除了所有的换行符。
你为什么要这么做?垂直空间又不花你什么钱。
而且,即使你愿意去掉所有的换行符,在我看来,这也更难读懂:

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

而不是这个

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

你所拥有的是完全好的。可读性代码应该是优先考虑的。即使这意味着更多的打字。

wfveoks0

wfveoks03#

你可以把它压缩到两行。

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

或者,在您的特定示例中,为3行。

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

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

5kgi1eie

5kgi1eie4#

有一个npm包try-catch提供的liner。您可以这样使用它:

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;
}

这个 Package 器所做的一切就是用try-catch块 Package 一个函数,并使用解构来获得结果。
此外,an idea可以使用与Go style error handling类似的内容:

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

laximzn55#

虽然这对你关于速记的问题没有帮助,但如果你想让一个try-catch在一个需要表达式的内联上下文中工作(不同于try-catch使用的语句),这可能会有帮助。
可以通过将try-catch封装到IIFE中来实现这一点,虽然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"

ozxc1zmp

ozxc1zmp6#

这里只使用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);

相关问题