正如您可以转换以下内容:
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
之类的内容。
感谢。
答案 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"
。