C# 在write查询中使用try语句
我有大约40个linq到sql查询,我习惯于将write语句包装在一个C# 在write查询中使用try语句,c#,sql-server,linq-to-sql,C#,Sql Server,Linq To Sql,我有大约40个linq到sql查询,我习惯于将write语句包装在一个catch try;大概是这样的: using (MyDC TheDC = new MyDC ()) { SomeTable TheTableInDB = new SomeTable(); ... populate record try { TheDC.SomeTables.InsertOnSubmit(TheTableInDB); TheDC.SubmitChanges();
catch try
;大概是这样的:
using (MyDC TheDC = new MyDC ())
{
SomeTable TheTableInDB = new SomeTable();
... populate record
try
{
TheDC.SomeTables.InsertOnSubmit(TheTableInDB);
TheDC.SubmitChanges();
}... catch...{...}
}
在这种情况下,try语句是否有点不必要,或者数据库写入操作可能会失败?数据库写入操作可能会因各种原因而失败,而不仅仅是因为数据完整性问题(例如,您试图将重复值写入具有
唯一性
约束的列中,但这也是因为连接可能会由于网络问题、服务器关闭或许多其他可能的原因而失败,这些原因都超出了您的代码控制范围,并且在您进行呼叫时完全不可预见
至于是否抓住这些例外情况,答案和许多事情一样是“视情况而定”
- 如果您可以在异常情况下执行一些有意义的操作(例如:您可以识别一个连接错误并重试该操作,因为在您的特定场景中,这是正常的),那么您应该尽一切努力捕获指示可以从中恢复的条件的特定异常
- 但是,如果异常指示无法(或不想)恢复的问题,则不应捕获;一般来说,经验法则是
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)
{
}
只是自找麻烦,因为你永远不会被告知出了什么问题!数据库写入可能会因为各种原因而失败,而不仅仅是因为数据完整性问题(例如,您试图将重复值写入具有
唯一性
约束的列中,但这也是因为连接可能会由于网络问题、服务器关闭或许多其他可能的原因而失败,这些原因都超出了您的代码控制范围,并且在您进行呼叫时完全不可预见
至于是否抓住这些例外情况,答案和许多事情一样是“视情况而定”
- 如果您可以在异常情况下执行一些有意义的操作(例如:您可以识别一个连接错误并重试该操作,因为在您的特定场景中,这是正常的),那么您应该尽一切努力捕获指示可以从中恢复的条件的特定异常
- 但是,如果异常指示无法(或不想)恢复的问题,则不应捕获;一般来说,经验法则是
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)
{
}
只是自找麻烦,因为你永远不会被告知出了问题!任何涉及网络的事情都可能失败。重要的问题是,你想如何处理故障?任何涉及网络的事情都可能失败。重要的问题是,你想如何处理故障?好的,谢谢你的输入。决定保留try语句,以防其他加入该项目的人错误地创建错误。@frenchie-这很好,但是
catch
块中实际上有什么东西吗?如果没有,我几乎会去掉它,让你的代码“快速失败”,这将有助于您的测试,因为您不会错过这些错误。好的,谢谢您的输入。决定保留try语句,以防其他加入项目的人错误地创建错误。@frenchie-这很好,但在catch
块中是否确实有任何内容?如果没有,我几乎会删除它,让您的代码“快速失败”,这将有助于您的测试,因为您不会错过这些错误。