【问题标题】:Exception handling internal bug异常处理内部错误
【发布时间】:2011-03-18 17:46:31
【问题描述】:

代码:

public static void Test()
{
   try
   {
       OpenConnectionToDatabase(); //Opens a connection to Oracle DB

   } catch(Exception e)
   {
       e.Data.Add("Query:", command.CommandText);
       throw e;
   }
}

当数据库服务器正在关闭并且通信中断时执行此代码时,.NET 会引发以下错误: 项目已添加。字典中的键:'查询:' 正在添加的键:'查询:' 在 System.Collections.ListDictionaryInternal.Add(对象键,对象值)

这怎么可能?

【问题讨论】:

  • OpenConnectionToDatabase 实际上做了什么?
  • OpenConnectionToDatabase() 有完全相同的异常处理吗?
  • 也许异常中的数据字典已经有该键的条目。
  • OpenConnectionToDatabase 只是打开与数据库的连接,当数据库关闭时失败。 OpenConnectionToDatabase 确实抛出了它自己的异常,但它没有向 Data 属性添加任何内容。
  • @user666423:单步执行代码应该会确认两次执行...

标签: c# asp.net


【解决方案1】:

编辑:(基于@LukeH 的评论)

e.Data["Query:"] = command.CommandText;

【讨论】:

  • 我不知道这个......如果“Query:”的现有值不同怎么办?您将丢失有价值的调试信息。
  • +1 表示 Austin 的评论,但如果您 确实 只想覆盖现有的“查询:”项目,那么您不需要 Contains 检查,因为使用索引器将根据需要添加或覆盖:e.Data["Query:"] = command.CommandText; 可以解决问题。
  • 这并不能解释问题发生的原因。 OpenConnectionToDatabase 引发异常后,e.Data 中不应该有任何内容。它仅在填充 e.Data 的 catch 块中。
【解决方案2】:

不要使用“throw e;”。只需使用throw

【讨论】:

  • 绝对是好建议,但并不是问题的真正答案。应该是评论。
猜你喜欢
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-09-15
  • 2011-04-03
  • 2014-01-08
  • 2014-04-06
  • 2013-12-27
  • 2013-05-30
相关资源
最近更新 更多