C# 在代码中为合法状态抛出异常

C# 在代码中为合法状态抛出异常,c#,.net,exception,C#,.net,Exception,例外是一个方便的容器,它很容易用于各种目的。但是用它来处理代码中的合法状态可以吗 我的示例:我有一个几何函数,可以在搜索半径内查找最近的对象: public IPoint FindNearest(IPoint origin, double searchRadius) { } 我的想法是,当搜索没有找到命中率时,我可以抛出一个异常。但这是个好主意吗?或者,我可以返回Null(我不喜欢),或者返回结果对象而不是点。异常通常表示无效或“异常”情况。在您的情况下,如果找不到命中是一个异常情况,并且应

例外是一个方便的容器,它很容易用于各种目的。但是用它来处理代码中的合法状态可以吗

我的示例:我有一个几何函数,可以在搜索半径内查找最近的对象:

public IPoint FindNearest(IPoint origin, double searchRadius)
{

}

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

异常通常表示无效或“异常”情况。在您的情况下,如果找不到命中是一个异常情况,并且应该总是在通常情况下找到它,那么您可以抛出异常


您应该始终避免抛出异常,因为它的性质很重。如果调用方代码频繁调用此方法,并且您的方法导致抛出大量异常,则会使程序运行缓慢

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

您可以执行以下操作

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.
}
public class NoHitOnRadius : IPoint {}

异常应该在无效的场景中使用,而不是控制程序流。

通常在这种情况下抛出异常不是一个好主意,它们代价高昂,并且在语义上完全意味着其他东西

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

在本例中,您将返回一个实现类或派生接口,称为:

IPoint nearestPoint;
If (TryFindNearest(origin, searchRadius, out nearestPoint))
{
    // do your stuff.
}
public class NoHitOnRadius : IPoint {}
当你没有被击中时,从电话中返回。然后调用代码检查返回类型:

var p = FindNearest(...);

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

尽管在这种特定情况下,我可能会使用
TryFindNearest
语义(以保持与
TryParse
等的通用性),

异常比检查null慢得多,所以我会使用null值。我不认为你会明白,比如说,两年后:)