0

使用:

node.js

問題:

今日コードをリファクタリングしているときに、これらの行のチャンクを見ました。それらの興味深い点は、try catch の各代替行で例外が発生し、コードがクラッシュする可能性があることです。私が従う慣行では、個々の例外を個別に処理する必要があり、最小限の (有用な) コード行を try キャッチに含める必要があります。プログラマーとして、どのアプローチに従うべきですか (A 、 B 、その他)? なぜ?コードの行数が減るので、個人的には A を使用します。

コード A:

function(err, someData, res){
    if(err){
        console.error(err);
    } else{

        try{
            data = JSON.parse(someData); //exception expected

            if(someVariable == "abc"){
                var items = data['a']; //exception expected
            } else if(site == "xyz"){
                var items = data['b']; //exception expected
            }

        } catch(err){
            console.error(err);
        }
}

コード B:

function(err, someData, res){
    if(err){
        console.error(err);
    } else{

        try{
            data = JSON.parse(someData); //exception expected
        } catch(err){
            console.error(err);
        }

        if(someVariable == "abc"){
            try{
                var items = data['a']; //exception expected
            } catch(err){
                console.error(err);
            }
        } else if(site == "xyz"){
            try{
                var items = data['b']; //exception expected
            } catch(err){
                console.error(err);
        }
            }
}
4

3 に答える 3

2

ツイストのあるA

Clean Code」の中で、「Uncle Bob」Martin は、例外の試行/キャッチは、独自の機能に値する特定のタスクであると考えています。実際の作業を別のメソッドに抽出します。このばかげた提案に最初は怒鳴られましたが、実際にそのアイデアが好きになりました。

parseData = function(someData, res) {
    data = JSON.parse(someData); //exception expected

    if(someVariable == "abc"){
        var items = data['a']; //exception expected
    } else if(site == "xyz"){
        var items = data['b']; //exception expected
    }
}

tryParseData = function(err, someData, res){
    if(err) {
        console.error(err);
    } else {
        try {
            parseData(someData, res);
        } catch(err) {
            console.error(err);
        }
    }
}
于 2013-01-14T20:59:09.683 に答える
1

Aは大丈夫です。

Bは悪いです。なぜなら、jsonの解析でエラーが発生した場合、成功しない可能性があることがわかっていても、残りのコードを実行し続けるからです。さらに悪いことに、コードが追加されると、実際には奇妙な副作用が発生したり、バグを追跡するのが困難になる可能性があります。また、読むのは非常に混乱します。

エラーキャッチを論理ブロックにグループ化する必要があります。一部が失敗し、残りの部分を実行しても意味がない場合は、キャッチするエラーの1ブロックとして扱います。

于 2013-01-11T12:06:35.620 に答える
1

多くのtry-catchブロック( B)(ソースコード行ごとに1つ)を使用しても利点はないと思います。コードの意味的に特定の部分ごとに単一のtry-catchブロック(A)を使用します。通常は単一のメソッドまたはコードブロックであり、アトミックに実行する必要があります。全体として成功または失敗する必要があります。

さまざまな例外をさまざまな方法で処理する必要がある場合は、catchブロックでそれらを確認してください。

try
{
  // ...
}
catch(e)
{
  if(e instanceof SpecificError)
  {
    //
  }
}

また、あなたはおそらく分析するかもしれませんe.message

于 2013-01-11T12:07:05.563 に答える