如何为'float方法'返回null - 错误处理

Sae*_*ani 1 c# error-handling exception-handling exception

我想在我的代码中加入一些错误处理.我无法弄清楚如何做以下示例:

public class DataPoints
{
   public PointF[] RawData {get; set;} //raw measurement pairs
   public float xMax; //max value on X axis
   public float yMax; //max value on Y axis

   public float GetMaxX()
   {
       if(RawData == null)
       {
          throw new NullReferenceException();
          return null; //THIS does not compile! I want to exit the method here
       }

     //DO other stuff to find max X
     return MAX_X; //as float
   }
}
Run Code Online (Sandbox Code Playgroud)

所以我的想法是,我需要检查是否RawData已经设置然后在GetMaxX()方法中执行其余的操作.这是一个很好的做法吗?在这种情况下你会做什么?

Joh*_*mer 5

这段代码有两个问题,

首先,你抛出异常,然后返回 - 返回语句将永远不会被命中,因为异常将停止执行方法的其余部分,使得return语句变得多余.

其次,当返回类型为float时,不能返回null; 你必须改变返回类型是浮动的吗?(参见:可空类型)

所以要么,如果它是一个真正的错误案例,因为没有什么可以做的只是例外:

   public float GetMaxX()
   {
       if(RawData == null)
          throw new NullReferenceException();

     //DO other stuff to find max X
     return MAX_X; //as float
   }
Run Code Online (Sandbox Code Playgroud)

或者,返回null并删除异常:

   public float? GetMaxX()
   {
       if(RawData == null)
          return null; 

     //DO other stuff to find max X
     return MAX_X; //as float
   }
Run Code Online (Sandbox Code Playgroud)

就个人而言,如果RawData为null是一个错误条件/异常情况应该永远不会发生,那么我会说抛出异常,并处理异常,如果抛出调用代码.

另一种方法是强制RawData通过构造函数初始化,使RawData私有(或至少是setter)并在那里抛出异常.让类中的任何其他逻辑清除抛出/空检查的任何异常,因为它可以假设RawData先前已经设置过.

导致的一些事情:

public class DataPoints
{
    private readonly PointF[] rawData; //raw measurement pairs
    public float xMax; //max value on X axis
    public float yMax; //max value on Y axis

    public DataPoints(PointF[] rawData)
    {
        if (rawData == null)
            throw new ArgumentNullException("rawData");

        this.rawData = rawData;
    }

    public float GetMaxX()
    {
        //DO other stuff to find max X
        return MAX_X; //as float
    }
}
Run Code Online (Sandbox Code Playgroud)