1

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

我有两个选择:

  1. 将强制转换包装在 try/catch ... 处理 FormatException (以防 X 列在其中呈现一些垃圾)... 并且仅使用有效的 DateTime 值。

  2. 在大小写之前检查 X 列以确保其格式正确(如何?),并且仅在格式正确时才进行转换。

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

谢谢你。

ps 1 投票赞成所有解释,接受 TryParse 的答案

Edit2:即使我使用了 TryParse,我也没有选中接受的答案以继续讨论。

我的“好数据”/“坏数据”比率约为 2/1 - 这意味着大量错误输入

如果没有其他问题,我将在几天内重新接受答案。

4

7 回答 7

13

你可以做第二个选项。DateTime.TryParse 可以提供帮助。

于 2009-02-10T07:53:43.297 回答
3

我认为这在一定程度上取决于您期望它以错误格式出现的频率。如果很少引发异常,则将某些内容包装在 try-catch 中根本不会产生任何影响。但是,如果您期望它会被提高很多,那么您应该给它添加一张支票。

于 2009-02-10T07:54:15.573 回答
3

我会选择第二种选择。我从不对常规代码使用异常,因为这样我就可以使用 Visual Studio 选项“抛出异常时进入调试器”运行。

这在识别代码中的真正问题时为我节省了大量时间,因为调试器将停止在实际问题而不是其他地方。如果异常用于非问题问题,我无法可靠地做到这一点。

于 2009-02-10T07:55:40.000 回答
2

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

于 2009-02-10T07:58:03.800 回答
2

我遵循的一条规则: 始终尝试尽可能多地手动捕获错误,并将异常作为最后的手段。

异常对性能有影响。

于 2009-02-10T07:59:52.470 回答
1

需要注意的一件事是,“TryParse”不一定比在“Parse”周围有一个 Try Catch 性能更好。

这取决于你的失败率。Try-Catch 会对性能产生影响,尽管大部分影响是在您失败时。但是,如果您有 95% 甚至更高的成功率,并且性能是一个考虑因素,那么您可能需要考虑将循环包装在 try-catch 中,以便仅在出现失败。

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

请记住,只有当您的数据主要是干净且性能是关键时,该解决方案才会更好。否则,更简单的一行“TryParse”会更好。

于 2009-02-10T14:27:32.267 回答
0

我同意 DateTime.TryParse。我在一个流量很大的网站上工作,我们永远不允许在 UI 中捕获异常!这有助于我们防止错误。我们非常努力地确保我们调用的代码不会抛出异常。

于 2009-02-10T08:36:51.477 回答