Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在write查询中使用try语句_C#_Sql Server_Linq To Sql - Fatal编程技术网

C# 在write查询中使用try语句

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();

我有大约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语句是否有点不必要,或者数据库写入操作可能会失败?

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

至于是否抓住这些例外情况,答案和许多事情一样是“视情况而定”

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

  • 但是,如果异常指示无法(或不想)恢复的问题,则不应捕获;一般来说,经验法则是

不要捕捉无法或无法处理的异常

因此,虽然这是可以的:

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
块中是否确实有任何内容?如果没有,我几乎会删除它,让您的代码“快速失败”,这将有助于您的测试,因为您不会错过这些错误。