尝试/捕获oneliner?

时间:2011-02-26 11:15:39

标签: javascript try-catch shorthand

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

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之类的内容。

感谢。

5 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:5)

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

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

即使您愿意删除所有新行,我认为这更难以理解:

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

比这个:

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

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

答案 2 :(得分:4)

你可以把它归结为两行。

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

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

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

无论哪种方式,如果你的代码都允许,那么两个衬里比典型的try / catch块更简洁,IMO。

答案 3 :(得分:0)

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

还有an idea使用类似于Go style error handling的东西:

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

答案 4 :(得分:0)

尽管这对您关于速记的问题没有帮助,但是如果您希望在期望表达式的内联上下文中使用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"