C# 如何为'返回null;浮动法';-错误处理

C# 如何为'返回null;浮动法';-错误处理,c#,exception,exception-handling,error-handling,C#,Exception,Exception Handling,Error Handling,我想在我的代码中加入一些错误处理。我不知道如何做,例如: 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(Ra

我想在我的代码中加入一些错误处理。我不知道如何做,例如:

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
   }
}

因此,我需要检查
RawData
是否已设置,然后在
GetMaxX()方法中执行其余的操作。这是一个好的做法吗?在这种情况下,您会怎么做?

如果您抛出异常,则无论如何都不会执行return语句,因此您尝试的正确版本将是

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

      //DO other stuff to find max X
      return MAX_X; //as float
   }
return语句不会编译,因为float是一种值类型,除非使用可为null的float类型,否则它永远不能为null


就我个人而言,在您给出的代码示例中,我会抛出异常,因为您当前通过公共setter公开了RawData对象,因此无法保证在调用GetMaxX时它不会为null。然后可以将异常传播到堆栈上,并在任何级别捕获,然而,通过使返回类型为null,您必须向调用代码添加额外的检查,以查看您的方法是否返回null,并适当地处理它。

如果您抛出异常,则无论如何都不会执行return语句,因此您尝试的正确版本将是

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

      //DO other stuff to find max X
      return MAX_X; //as float
   }
return语句不会编译,因为float是一种值类型,除非使用可为null的float类型,否则它永远不能为null


就我个人而言,在您给出的代码示例中,我会抛出异常,因为您当前通过公共setter公开了RawData对象,因此无法保证在调用GetMaxX时它不会为null。然后可以将异常传播到堆栈上并在任何级别捕获,而通过使返回类型为null,您必须向调用代码添加额外的检查,以查看您的方法是否返回null并适当地处理它。

此代码有两个问题

首先抛出一个异常,然后是一个return——return语句永远不会被命中,因为异常将停止方法其余部分的执行,这使得return语句多余

第二,当返回类型为float时,不能返回null;您必须将返回类型更改为float?(见:)

因此,如果这是一个真正的错误案例,您也无能为力,只处理例外情况:

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

     //DO other stuff to find max X
     return MAX_X; //as float
   }
或者,返回null并删除异常:

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

     //DO other stuff to find max X
     return MAX_X; //as float
   }
就个人而言,如果
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
    }
}

该代码有两个问题

首先抛出一个异常,然后是一个return——return语句永远不会被命中,因为异常将停止方法其余部分的执行,这使得return语句多余

第二,当返回类型为float时,不能返回null;您必须将返回类型更改为float?(见:)

因此,如果这是一个真正的错误案例,您也无能为力,只处理例外情况:

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

     //DO other stuff to find max X
     return MAX_X; //as float
   }
或者,返回null并删除异常:

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

     //DO other stuff to find max X
     return MAX_X; //as float
   }
就个人而言,如果
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
    }
}

我不清楚万一发生错误你想做什么。您想抛出异常还是返回null

一般来说,抛出异常是针对调用方应该更清楚地知道并且您不想尝试恢复的情况——让调用方清理混乱

当调用方可能有充分的理由不初始化RawData时,返回null,这在您的情况下是有意义的。为此,你需要

public float? GetMaxX()

如果你真的想在什么都没有初始化的时候爆炸,把RawData作为一个参数放在你的构造函数中。

我不清楚在发生错误时你想做什么。您想抛出异常还是返回null

一般来说,抛出异常是针对调用方应该更清楚地知道并且您不想尝试恢复的情况——让调用方清理混乱

当调用方可能有充分的理由不初始化RawData时,返回null,这在您的情况下是有意义的。为此,你需要

public float? GetMaxX()

如果真的想在未初始化任何内容时爆炸,请将RawData作为参数放入构造函数。

您可以删除throw exception语句下面的return语句。每当抛出异常时,不会在方法中执行其他语句(最后,块是该异常的异常,但在该上下文中是不可逆的)

除了函数的这个问题,我还有一个关于RawData属性是否可以公开访问的论点。一般来说,打开这样一个收藏不是一个好主意。正如@sq33G所建议的,您可以通过将RawData作为构造函数参数传递来保证拥有一个有效的对象。当一个无效数组出现时,您可能会在构造函数的早期失败