Подтвердить что ты не робот

Попробуйте/поймать oneliner?

Так же, как вы можете преобразовать следующее:

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.

Спасибо.

4b9b3361

Ответ 1

Вы можете использовать следующую функцию, а затем использовать ее для oneline вашей попытки /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;
} 

Ответ 2

Нет, нет "однострочного" варианта try - catch, кроме простого удаления всех новых строк.

Зачем вам это нужно? Вертикальное пространство вам ничего не стоит.

И даже если вы решите удалить все новые строки, это, на мой взгляд, труднее читать:

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

чем это:

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

У тебя все прекрасно. Чтение кода должно быть приоритетом. Даже если это означает, что вы печатаете больше.

Ответ 3

Вы можете получить его до двух строк.

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

Или, в вашем конкретном примере, 3 строки.

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

В любом случае, если ваш код позволяет это, два лайнера гораздо более сжатые, IMO, чем обычный блок try/catch.

Ответ 4

Один пакет доступен в виде пакета npm try-catch. Вы можете использовать это следующим образом:

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

const [error, result] = tryCatch(parse, 'hello');

Существует аналогичный подход для async-await попытаться поймать:

const {readFile, readDir} = require('fs').promises;

read('./package.json').then(console.log);

async function read(path) {
    const [error, data] = await tryToCatch(readFile, path, 'utf8');

    if (!error)
        return data;

    if (error.code !== 'EISDIR')
        return error;

    return await readDir(path);
}

Все, что делают эти обёртки - это обертывают одну функцию блоком try-catch и используют деструктуризацию для получения результата.