在写查询中使用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语句是否有点不必要,或者数据库的写操作是否可能失败?
数据库写可能会因为各种原因而失败,不仅仅是因为数据完整性问题(例如,您试图将重复值写入具有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)
{
}
就是自找麻烦,因为你永远不会被告知哪里出了问题!