7

JavaScript では、null のブロック内の多くの属性をテストするのではなく、try-catch ブロックを使用してエラーを無視するのは間違っていますか?

try{ 
   if(myInfo.person.name == newInfo.person.name
      && myInfo.person.address.street == newInfo.person.address.street
      && myInfo.person.address.zip == newInfo.person.address.zip) {
         this.setAddress(newInfo);
    } 
} catch(e) {} // ignore missing args
4

6 に答える 6

4

特定の条件が予想される場合は、明示的にテストすると、コードの保守が容易になります。上記を次のように書きます

if(   myInfo && newInfo 
      && myInfo.person && newInfo.person
      && myInfo.person.address && newInfo.person.address
      && ( myInfo.person.name == newInfo.person.name
           && myInfo.person.address.street == newInfo.person.address.street
           && myInfo.person.address.zip == newInfo.person.address.zip
         )
) 
{
     this.setAddress(newInfo);
} 

これにより、効果がより明確になります。たとえば、newInfo はすべて入力されているが、myInfo の一部が欠落しているとします。その場合、実際に setAddress() を呼び出す必要があるのではないでしょうか? もしそうなら、そのロジックを変更する必要があります!

于 2008-09-26T19:39:40.473 に答える
2

はい。1 つには、引数の欠落以外にも、さまざまな理由で例外がスローされる可能性があります。キャッチオールは、おそらく望ましくないケースを隠します。

于 2008-09-26T19:38:24.233 に答える
1

例外をキャッチするつもりなら、それで何かをすると思います。それ以外の場合は、より高いレベルで何らかの方法で処理できるようにバブルアップさせます (エラーが報告されたのがブラウザだけであっても)。

于 2008-09-26T19:38:05.763 に答える
1

関連する注意事項として、IE では、仕様に使用できると記載されていても、try/finally の組み合わせを使用することはできません。"finally" を実行するには、空であっても catch ブロックを定義する必要があります。

//this will [NOT] do the reset in Internet Explorer
try{
  doErrorProneAction();
} finally {
  //clean up
  this.reset();
}

//this [WILL] do the reset in Internet Explorer
try{
  doErrorProneAction();
} catch(ex){
  //do nothing
} finally {
  //clean up
  this.reset();
}
于 2008-09-26T19:47:41.047 に答える
0

チェックを行うヘルパー関数をいつでも作成できます。

function pathEquals(obj1, obj2, path)
{
    var properties = path.split(".");
    for (var i = 0, l = properties.length; i < l; i++)
    {
        var property = properties[i];
        if (obj1 === null || typeof obj1[property] == "undefined" ||
            obj2 === null || typeof obj2[property] == "undefined")
        {
            return false;
        }

        obj1 = obj1[property];
        obj2 = obj2[property];
    }

    return (obj1 === obj2);
}

if (pathEquals(myInfo, newInfo, "person.name") &&
    pathEquals(myInfo, newInfo, "person.address.street") &&
    pathEquals(myInfo, newInfo, "person.address.zip"))
{
    this.setAddress(newInfo);
}
于 2008-09-26T21:48:11.677 に答える
-1

与えられた例については、それは悪い習慣だと思います。ただし、予想されるエラーを単純にトラップする方が効率的な場合もあります。GUID としてキャストする前に、文字列の形式を検証することが良い例です。

于 2008-09-26T19:37:41.240 に答える