31

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

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?当然,我可以只删除换行符,但我的意思是类似于? :for 的东西if

谢谢。

4

5 回答 5

12

您可以使用以下函数,然后使用该函数将您的 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;
} 
于 2011-02-26T11:48:50.143 回答
9

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

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

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

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

比这个:

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

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

于 2011-02-26T11:18:46.997 回答
7

您可以将其简化为两行。

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

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

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

无论哪种方式,如果您的代码允许,两个班轮比典型的 try/catch 块更简洁,IMO。

于 2011-02-26T11:21:32.160 回答
5

有一个可用作 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');
于 2019-10-16T18:58:35.283 回答
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".

于 2020-07-09T00:11:12.337 回答