我有大约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语句有点不必要,或者写入的数据库操作是否可能失败?
感谢。
答案 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)
{
}
只是在寻找麻烦,因为你永远不会被告知出现了问题!