在代码中抛出合法状态的异常

时间:2012-12-11 10:00:07

标签: c# .net exception

Exception是一个方便的容器,很有可能用于各种目的。但是可以使用它来处理代码中的合法状态吗?

我的例子:我有一个几何函数,可以在搜索范围内找到最近的对象:

public IPoint FindNearest(IPoint origin, double searchRadius)
{

}

我的想法是,当搜索没有找到命中时,我可以抛出异常。但这是个好主意吗?或者,我可以返回Null(我不喜欢),或返回结果对象而不是Point。

4 个答案:

答案 0 :(得分:5)

通常,异常表示无效或“例外”情形。在你的情况下,如果没有找到命中是一个例外情况,它应该总是在通常情况下找到,那么你可以抛出异常。

你应该总是尽量避免抛出异常,因为它的性质很重。如果调用者代码经常调用此方法并且您的方法导致大量异常,则会使您的程序变慢

答案 1 :(得分:3)

最佳做法是仅在无法以函数方式处理错误时才使用异常。在这种情况下,找不到位置并返回null是最好的,因为您的调用函数可以以函数方式处理null。除了干净的代码之外,抛出和处理异常对于性能来说实际上是不好的,所以只能作为最后的手段使用它们。

答案 2 :(得分: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.
}

在无效场景中应使用例外来控制程序流程。

答案 3 :(得分:2)

通常在这种情况下抛出异常不是一个好主意,它们很昂贵,并且语义上完全不同于其他东西。

你可以返回null并进行空检查,或者我偶尔会发现使用Special Case模式可以很好地工作,并且如果你给类/接口一个合理的名称,那么可以使用可读的代码。

在这种情况下,您将返回一个实现类或派生接口,其名称如下:

public class NoHitOnRadius : IPoint {}

当你没有命中时,从电话中返回。然后调用代码检查返回类型:

var p = FindNearest(...);

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

虽然在这种特定情况下,我可能会使用TryFindNearest语义(以保持TryParse之类的共性)RobH suggests