2

Exception は、さまざまな目的で使用したくなる便利なコンテナーです。しかし、コード内で合法的な状態を処理するために使用しても問題ないでしょうか?

私の例: 検索半径内で最も近いオブジェクトを見つける幾何学的関数があります。

public IPoint FindNearest(IPoint origin, double searchRadius)
{

}

私の考えは、検索でヒットが見つからない場合に例外をスローできるというものでした。しかし、これは良い考えですか?別の方法として、返すNull(これは好きではありません) か、Point の代わりに結果オブジェクトを返すこともできます。

4

4 に答える 4

5

一般に、例外は無効または「例外的な」シナリオを表します。あなたの場合、ヒットが見つからないことが例外的なシナリオであり、通常は常にヒットする必要がある場合は、例外をスローできます。

重い性質のため、常に例外をスローしないようにする必要があります。呼び出し元のコードがこのメソッドを頻繁に呼び出しており、メソッドが多くの例外をスローする結果となっている場合、プログラムが遅くなります。

于 2012-12-11T10:04:31.413 に答える
3

次のようなことができます

public bool TryFindNearest(IPoint origin, double searchRadius, out IPoint result)
{
    // your logic here, return true if you find a point. Otherwise return false.
}

次に、呼び出し元のコードは次のようになります。

IPoint nearestPoint;
If (TryFindNearest(origin, searchRadius, out nearestPoint))
{
    // do your stuff.
}

プログラム フローを制御しないように、無効なシナリオで例外を使用する必要があります。

于 2012-12-11T10:07:32.383 に答える
3

機能的な方法でエラーを処理できない場合にのみ、例外を使用することをお勧めします。この場合、場所を見つけずに null を返すのが最善です。これは、呼び出し元の関数が機能的な方法で null を処理できるためです。きれいなコードに加えて、例外のスローと処理はパフォーマンスに非常に悪いため、最後の手段としてのみ使用してください。

于 2012-12-11T10:04:50.183 に答える
2

通常、この状況で例外をスローすることは良い考えではありません。それらは高価であり、意味的にはまったく別のことを意味します。

null を返して null チェックを実行することもできますが、クラス/インターフェースに適切な名前を付ければ、 Special Caseパターンを使用するとうまく機能し、読みやすいコードになることがときどきわかります。

この例では、次のような実装クラスまたは派生インターフェイスを返します。

public class NoHitOnRadius : IPoint {}

ヒットがない場合は、呼び出しからそれを返します。次に、呼び出し元のコードが戻り値の型をチェックします。

var p = FindNearest(...);

if (p is NoHitOnRadius) 
{
    // Do something.
}

この特定の状況では、 RobH が提案するセマンティクス (などTryFindNearestとの共通性を維持するため) を使用する可能性があります。TryParse

于 2012-12-11T10:08:16.037 に答える