在写查询中使用try语句

本文关键字:try 语句 查询 | 更新日期: 2023-09-27 18:05:20

我有大约40个linq-to-sql查询,我养成了在catch-try周围包装写语句的习惯;像这样:

using (MyDC TheDC = new MyDC ())
{
   SomeTable TheTableInDB = new SomeTable();
   ... populate record
   try
   {
      TheDC.SomeTables.InsertOnSubmit(TheTableInDB);
      TheDC.SubmitChanges();
   }... catch...{...}
}

在这种情况下,try语句是否有点不必要,或者数据库的写操作是否可能失败?

在写查询中使用try语句

数据库写可能会因为各种原因而失败,不仅仅是因为数据完整性问题(例如,您试图将重复值写入具有UNIQUE约束的列中,还因为连接可能由于网络问题而失败,或者服务器关闭,或者确实有许多其他可能的原因,这些原因都超出了代码的控制范围,并且在您进行调用时完全不可预见。

至于是否捕捉这些异常,和许多事情一样,答案是"视情况而定"。

  • 如果您可以在异常的情况下做一些有意义的(例如:您可以识别连接错误并重试操作,因为在您的特定场景中这是OK的),那么无论如何您应该捕获那些特定的异常,这些异常指示您可以从中恢复的条件。

  • 然而,如果异常表明一个问题,你不能(或不想)恢复,你不应该捕获;一般来说,经验法则是

不要捕捉你不能或不愿处理的异常

所以这是可以的:

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
}

请参阅此处了解如何确定是否可以重试操作,以及从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)
{
}

就是自找麻烦,因为你永远不会被告知哪里出了问题!