尝试/捕获oneliner?

pim*_*vdb 17 javascript try-catch shorthand

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

var t;
if(foo == "bar") {
    t = "a";
} else {
    t = "b";
}
Run Code Online (Sandbox Code Playgroud)

成:

t = foo == "bar" ? "a" : "b";
Run Code Online (Sandbox Code Playgroud)

,我想知道是否有一种速记/在线方式来转换这个:

var t;
try {
    t = someFunc();
} catch(e) {
    t = somethingElse;
}
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以用速记的方式做到这一点,最好是一个oneliner?当然,我可以删除换行符,但我的意思是喜欢的? :东西if.

谢谢.

cod*_*ser 10

有一个衬垫可用作 npm 包try-catch。您可以这样使用它:

const tryCatch = require('try-catch');
const {parse} = JSON;

const [error, result] = tryCatch(parse, 'hello');
Run Code Online (Sandbox Code Playgroud)

async-await try-to-catch有类似的方法:

const tryCatch = require('try-catch');
const {parse} = JSON;

const [error, result] = tryCatch(parse, 'hello');
Run Code Online (Sandbox Code Playgroud)

所有这些包装器所做的就是用块包装一个函数try-catch并使用解构来获取结果。

还有一个想法是使用类似于Go 风格的错误处理

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;
}
Run Code Online (Sandbox Code Playgroud)


In *_*ico 6

没有,没有"一班轮"版try- catch除了简单地删除所有换行符.

你为什么想要?垂直空间不需要任何费用.

即使你决定删除所有新行,我认为这更难以理解:

try{t = someFunc();}catch(e){t = somethingElse;}
Run Code Online (Sandbox Code Playgroud)

比这个:

try {
    t = someFunc();
} catch(e) {
    t = somethingElse;
}
Run Code Online (Sandbox Code Playgroud)

你有什么是完美的.可读代码应该是优先事项.即使这意味着更多打字.

  • "垂直空间不会花费你任何东西":不是真的,视觉噪音,滚动,人类解析的时间是真正的成本,特别是当他们最初寻找主要执行路径,而不是错误处理时.大多数IDE折叠Java导入都是有充分理由的. (3认同)

Chr*_*ris 6

您可以将其缩减为两行。

try { doSomething(); }
catch (e) { handleError(); }
Run Code Online (Sandbox Code Playgroud)

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

var t;
try { t = doSomething(); }
catch (e) { t = doSomethingElse(); }
Run Code Online (Sandbox Code Playgroud)

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

  • 您可以将其缩减为一行... `try { doSomething(); } catch (e) { handleError(); }` (2认同)
  • 我非常清楚它不太干净。我想我的观点是:说“你可以把它减少到两行”有什么意义,这和说你可以把它减少到一行一样明显。 (2认同)

ren*_*ene 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;
} 
Run Code Online (Sandbox Code Playgroud)

  • 这是对“我永远不会使用它”的投票 (7认同)