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