English 中文(简体)
处理异常与防止它们在第一时间发生 - C#
原标题:
  • 时间:2009-02-10 07:50:57
  •  标签:

我在asp:GridView中有一个带有DateTime?数据的asp:BoundColumn(我称其为列X)。我循环遍历网格中的所有行,并将.Text属性强制转换为DateTime(我需要这样做来进行一些检查并在需要时更改单元格背景颜色)。

我有两个选项:

  1. 将 cast 包裹在 try/catch 中... 处理 FormatException(以防止列 X 中含有垃圾内容)... 仅使用有效的 DateTime 值。

  2. check the column X to make sure it s in the correct format (how?) before casing, and only cast if format is ok.

我应该采取哪种方法,为什么?

谢谢。

附言:所有解释都可以点赞,对于TryParse,接受的回答会被选为最佳答案。

编辑2:虽然我使用了TryParse, 但我取消了接受的答案,以保持讨论继续。

我的“好数据”/“坏数据”比例约为2/1 - 这意味着有很多错误的输入。

如果没有其他问题,我会在几天后重新接受这个答案。

最佳回答

您可以选择第二个选项。DateTime.TryParse 可以帮助。

问题回答

我认为这取决于你预计它以错误的格式出现的频率。如果异常很少被引发,那么在 try-catch 中包装一些内容实际上根本没有任何影响。但是,如果你预计会经常引发异常,那么你可能应该添加相应的检查。

我会选择第二个选项。我从来不在正常代码中使用异常,因为这样我就可以使用Visual Studio选项“在抛出异常时跳入调试器”。

这样做可以帮助我在识别代码中的实际问题时节省很多时间,因为调试器会在实际问题处停下来,而不是在其他地方。如果异常用于非问题问题,我无法可靠地这样做。

异常需要大量资源才能引发和捕获。当有更优雅的选项时,应避免让它们被抛出。

我遵循的规则:尽可能手动捕获尽可能多的错误,并将异常作为最后的选择。

异常会对性能产生影响。

需要注意的一件事是,“TryParse”不一定比在“Parse”周围使用Try Catch更具性能优势。

It depends on your failure rate. Try-Catch s have a performance impact, although most of the impact is when you fail. However, if you have a 95% success rate, or even higher, and performance is a consideration, then you might want to think about wrapping your loop in a try-catch, so that you only hit your "try" statement when there s a failure.

int i = 0;
List<String> prePopulated;
List<DateTime> toPopulate;

while(i < prepopulated.Length)
{
   Try
   {
      while(i < prepopulated.Length)
      {
         List<DateTime>.add(DateTime.Parse(prePopulated[i]));
         i++;
      }
   }
   Catch(Exception ex)
   {
      //log if necessary
      i++;
   }
}

Keep in mind, that solution is only better if your data is primarily clean and performance is key. Otherwise, the simpler one line "TryParse" is better.

我同意DateTime.TryParse的做法。我工作在一个非常高流量的网站上,我们不能在用户界面中捕获任何异常,这有助于我们预防错误。我们非常努力地确保我们调用的代码不会抛出异常。





相关问题
热门标签