正如您可以转换以下内容:
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
。
谢谢。
您可以使用以下函数,然后使用它来连接您的 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;
}
有一个 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');
不,除了简单地删除所有换行符之外,没有“单行”版本的
try
-catch
。
你为什么要这么做?垂直空间不会花费您任何费用。
即使您愿意删除所有换行符,在我看来,这也更难阅读:
try{t = someFunc();}catch(e){t = somethingElse;}
比这个:
try {
t = someFunc();
} catch(e) {
t = somethingElse;
}
你拥有的一切都很好。可读的代码应该是优先考虑的。即使这意味着更多的打字。
你可以把它减少到两行。
try { doSomething(); }
catch (e) { handleError(); }
或者,在您的具体示例中,3 行。
var t;
try { t = doSomething(); }
catch (e) { t = doSomethingElse(); }
无论哪种方式,如果您的代码允许,在我看来,两行代码比典型的 try/catch 块要简洁得多。
虽然这对您关于速记的问题没有帮助,但如果您正在寻求在需要表达式的内联上下文中工作的 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"
。
这里只使用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);
有草案和提案,它们将完全按照您想要的方式进行。它称为安全赋值运算符 (?=)。
语法为:
const t ?= someFunc() || somethingElse;
或
const [error, t] ?= someFunct();
请参阅:dev.to - JavaScript 中的轻松错误处理:安全赋值运算符如何简化您的代码 或 Medium - JavaScript 安全赋值运算符 (?=):完整指南
并且您已经可以使用类似的包:https://www.npmjs.com/package/with-error
关注他们的进展。我也很期待:)