31

次のように変換できます。

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ます。

ありがとう。

4

5 に答える 5

12

次の関数を使用して、それを使用してtry/catchを1行にすることができます。使用が制限され、コードの保守が難しくなるため、使用することはありません。

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;
} 
于 2011-02-26T11:48:50.143 に答える
9

いいえ、「ワンライナー」バージョンはありませんtry-catch単にすべての改行を削除する以外に。

なぜあなたはしたいですか?垂直方向のスペースには何の費用もかかりません。

そして、すべての改行を削除することに決めたとしても、私の意見では、これは読みにくいです。

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

これより:

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

あなたが持っているものは完全に大丈夫です。読み取り可能なコードを優先する必要があります。それがより多くのタイピングを意味するとしても。

于 2011-02-26T11:18:46.997 に答える
7

あなたはそれを2行に減らすことができます。

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

または、特定の例では、3行です。

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

いずれにせよ、コードで許可されている場合、2つのライナーは通常のtry /catchブロックよりもはるかに簡潔です(IMO)。

于 2011-02-26T11:21:32.160 に答える
5

npmパッケージtry-catchとして利用可能なライナーが1つあります。次のように使用できます。

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

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

async-await キャッチしようとするための同様のアプローチがあります:

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;
}

このラッパーが行うのは、1つの関数をtry-catchブロックでラップし、デストラクチャリングを使用して結果を取得することだけです。

また、 Goスタイルのエラー処理に似たものを使用するというアイデアもあります。

// this is not real syntax
const [error, result] = try parse('hello');
于 2019-10-16T18:58:35.283 に答える
2

これは速記についての質問には役立ちませんが、式を期待するインラインコンテキストで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"ます。

于 2020-07-09T00:11:12.337 に答える