C# 属性中的错误处理,我知道它很糟糕,但需要修复

C# 属性中的错误处理,我知道它很糟糕,但需要修复,c#,error-handling,coding-style,C#,Error Handling,Coding Style,我知道在属性中放置错误处理是不好的做法,我只是想知道应该在哪里放置错误处理。我知道财产的价值永远不会改变 我有一个gridview,其中允许用户将单元格2更改为任何值(char),但如果用户输入的值大于char,则会填充一个错误,我的最佳选择是以某种方式检查gridview吗 我似乎有点碰到这个问题,当我有返回类型的属性甚至方法时,如果不执行try-catch(或TryParse)并且返回类型错误但为空,我就无法进行错误处理 public char WeightClass { get

我知道在属性中放置错误处理是不好的做法,我只是想知道应该在哪里放置错误处理。我知道财产的价值永远不会改变

我有一个gridview,其中允许用户将单元格2更改为任何值(char),但如果用户输入的值大于char,则会填充一个错误,我的最佳选择是以某种方式检查gridview吗

我似乎有点碰到这个问题,当我有返回类型的属性甚至方法时,如果不执行try-catch(或TryParse)并且返回类型错误但为空,我就无法进行错误处理

public char WeightClass
{
   get
      {
         return Convert.ToChar(gvFighters.Rows[rowNumber].Cells[2].Value);
      }
}
编辑:如果你能为代码实践提供一些额外的阅读资料,这也将是一个加分阅读大部分代码完成

编辑

   public char FlightClassFromRow()
            {   
                char result;
                if(Char.TryParse(gvSegments.Rows[rowNumber].Cells[2].Value.ToString(),out result))
                {
                    return result;
                }
     //if false, return empty char? is that the best way?
            }

不需要试抓

  • 检查行数和列数是否小于行数/列数
  • 使用Char.TryParse

但是,如果一个属性所做的不仅仅是一个简单的返回,那么最好只使用一个方法。

下面是一个使用前面提到的枚举的示例实现:

    private static WeightClass WeightClassFromRow(DataGridView gvSegments, int rowNumber)
    {
        return WeightClassFromChar(gvSegments.Rows[rowNumber].Cells[SegmentColumns.WeightClass].Value as string);
    }

    private static WeightClass WeightClassFromChar(string weightClassString)
    {
        if (string.IsNullOrEmpty(weightClassString))
            return WeightClass.None;
        switch (weightClassString[0])
        {
            case 'H':
                return WeightClass.Heaveyweight;
            case 'L':
                return WeightClass.Lightweight;
            default:
                return WeightClass.None;
        }
    }

就个人而言,作为一项规则,如果属性调用涉及任何可能出错的方法调用,那么我将属性设置为方法。属性应始终返回,除非对象处于无效状态(无论出于何种原因),否则如果字符串长度大于1,Convert.ToChar不会引发异常。相反,它只使用字符串的第一个字符。您应该在单元格中添加CompareValidator(或者CustomValidator,如果不那么容易的话)并验证文本框。你们两个都可以添加GridView的RowCreated事件处理程序。@Alastair Pitts我已经将其编辑为一个方法,但我仍然必须返回一个char。。但是我不想返回一个空白字符,因为我必须对它进行另一次检查…但这是唯一的方法吗?>好的,我已经编辑了一个方法,似乎我仍然必须返回一些东西,我不能只是抛出一个msgbox…你有多个选项。使用带有值的枚举并添加一个“空”枚举。使用一个字符作为“无值”(例如,e表示空)。或者使用char?,一个可为空的char,尽管我更喜欢前两个选项。我喜欢enum,让我确保它是正确的。我会为每架战斗机的重量设置一个枚举,然后在最后设置一个名为empty=x的枚举,然后我可以检查该枚举是否设置为空,如果设置为空,则显示msgbox或其他内容谢谢!杰弗里,你会这样做吗?@Johnny Quest-是的,我会这样做。