在写查询中使用try语句

时间:2014-05-26 21:34:02

标签: c# sql-server linq-to-sql

我有大约40个linq-to-sql查询,我养成了围绕catch-try包装write语句的习惯。像这样的东西:

using (MyDC TheDC = new MyDC ())
{
   SomeTable TheTableInDB = new SomeTable();
   ... populate record

   try
   {
      TheDC.SomeTables.InsertOnSubmit(TheTableInDB);
      TheDC.SubmitChanges();
   }... catch...{...}
}

这个上下文中的try语句有点不必要,或者写入的数据库操作是否可能失败?

感谢。

1 个答案:

答案 0 :(得分:4)

数据库写入可能由于各种原因而失败,不仅仅是因为数据完整性问题(例如,您尝试将重复值写入具有UNIQUE约束的列,而且因为连接可能由于网络问题,或服务器关闭,或者确实是许多其他可能的原因,这些原因都是您的代码无法控制的,并且在您拨打电话时完全无法解决。

至于是否要捕捉这些例外情况,答案与许多事情一样,取决于"它取决于"。

  • 如果您在异常情况下可以执行某些有意义的(例如:您可以识别连接错误并重试操作,因为在您的特定方案中可以正常),那么所有意味着您应该捕获那些特定的异常,这些异常表明您可以从中恢复的条件。

  • 但是,如果异常表示您无法(或者不想)从中恢复,则您不应该抓住;一般来说,经验法则是

  

不要抓住您无法或不会处理的例外

所以虽然没关系:

try
{
   //something
}
catch(SqlException sqlEx)
{
    //check sqlEX to see if you can recover, retry, fail gracefully, etc, 
    //or if you really have to give up and then
    throw; //only if you need to pass it on up
}

有关如何识别是否可以重试该操作的信息,请参阅here,并从SQL错误中识别更多详细信息等。

这毫无意义:

try
{
   //something
}
catch(Exception ex)
{
    throw; //would have been thrown up the call stack anyway,
    //and it's easy to accidentally write
    throw ex; //which loses important call stack information from the original exception

}

当然还有这个

try
{
  //something
}
catch(Exception)
{
}

只是在寻找麻烦,因为你永远不会被告知出现了问题!