5

現在、リファクタリングしようとしているコードがいくつかあります。例外の大規模なセットには、すべての例外に共通のコードと、特定の例外タイプごとに個別に処理する必要のある特定のコードが含まれています。catch各ブロックの共通部分を取り除く方法を見つけようとしています。1つのアイデアは、次のようにすることです。

try {
  /* Stuff that may fail */
} catch( const std::exception & ) {
  /* do common part here */
  try { throw; } 
  catch( const exception1 & ) {
    /* do stuff for exception1 here */
  }
  catch( const exception2 & ) {
    /* do stuff for exception2 here */
  }
}

しかし、これはやや醜いように私を襲います。

この共通論理を除外するためのより良い方法はありますか、それとも実際にこの試みを完全に回避する理由がありますか?

4

3 に答える 3

3

例外の大規模なセットには、いくつかの一般的なコードがあります

共通コードを関数またはメソッドに移動します。それぞれからメソッドを呼び出しますcatch。他の重複を排除するのと同じように。try..の存在はcatch違いを生みません。

しかし、 「多数の例外セット」について本当に心配している場合、本当の問題は、多数の例外セットがあることである可能性があります。異なる例外がまったく異なる処理を必要とするのはなぜですか?例外は本当に例外的なイベントにのみ使用されていますか?

于 2012-04-13T12:04:04.193 に答える
3

一般に、try/catchはコードにまばらにしか表示されません。catch問題は、たとえば、早期復帰の場合、条項で実行されるアクションも実行する必要があることです。

慣用句のC++は、RAIIを広範囲に使用して、句でクリーンアップする必要がある状況を回避しますcatch。これにより、通常、ほとんどの作業が削除されます。

さて、あなたのパターン自体はそれほど悪くはありません、それは一般的なものを考慮に入れています。しかし、この一般的なものはおそらく自動的に処理される可能性があります。

私が偶然見つけたすべてのコードベースで、節の真の使用法を目にしたのはほんの数回でしたcatch。それをクラッチとして使用しないでください。

于 2012-04-13T12:15:22.347 に答える
0

私は実際には、共通のコードを関数に移動するだけです。

ここに別のアイデアがあります:

try {
  /* Stuff that may fail */
} catch( const std::exception & e) {
  /* do common part here */  
  if (const exception1 * e1 = dynamic_cast<const exception1*>(&e) {
    /* do stuff for exception1 here */
  } else if (const exception2 * e2 = dynamic_cast<const exception2*>(&e) {
    /* do stuff for exception2 here */
  } else
    throw;
}
于 2012-04-13T12:14:59.027 に答える