关于c#:数据库插入,更新和删除是否应该包含在try / catch中?

Should database insertions, updates and deletions be wrapped in try/catch?

在处理数据库相关操作时,我总是使用try-catch。

1
2
3
4
5
6
7
8
9
try
{
 DataContext.AddtoObjectname(obj);
 DataContext.SaveChanges();
}
catch(Exception e)
{
 throw new Exception("Problems adding object" + e);
}

但我在这里读到了影响性能的尝试/捕获-当不抛出异常时,try/catch块是否会损害性能?所以我应该为我正在做的事情添加"尝试捕获"还是选择其他方式。谢谢你的帮助。


Try/Catch语句本身不会显著影响性能,但抛出和捕获许多异常可能会影响性能。

一般来说,您希望确保只捕获相关的异常,否则可能会掩盖应用程序中的错误。在这种情况下,dataException或updateException可能是很好的候选者,因为它们是在saveChanges中发生错误时将引发的异常。

似乎您正在捕获一个例外,以便向它添加您自己的附加信息。在这种情况下,最好将原始异常保留为内部异常。

1
throw new Exception("Problems adding object" + e, e);

我还建议为此目的创建您自己的特定于应用程序的异常类型。


  • 只有抓住你能处理的。如果您不能处理错误并优雅地恢复,那么就让异常冒泡到可以处理它的更高级别。如果您想将异常记录到它发生的地方(合理),那么记录它,如果您无法恢复,则重新抛出相同的异常。

  • 作为一般规则,永远不要捕获一般异常。相反,明确说明例外情况:catch (SQLException e)而不是catch (Exception e)

  • 如果从catch块抛出异常,请确保将捕获的异常放入新异常的内部异常中。

  • 不要扔东西,具体点。如果框架还没有您所需要的异常,那么就做一个。


这要看情况而定。如果您只打算重新抛出异常,那么在try-catch中没有任何意义。您添加代码时没有提供任何实际值。如果您要做异常的事情,记录它,检查特定的类型等,这是不同的,因为您打算对意外的行为采取行动。

But I read about try/catch affecting
performance..

Try-Catch并不是真正影响性能的因素,它创建的异常是"昂贵的"操作。事实上,在大范围的事情上,这并不是那么糟糕,你不应该因为"花费"而避免例外。

在相关的注释中,如果您执行了一个try-catch,除非您不需要创建一个新的异常,如果您可以避免它。只是重新抛出旧的异常。


是的,这就是尝试/捕获的目的。失去控制并有使数据库处于不一致状态的风险比尝试/捕获开销更高。如果有例外,一般来说,没有"便宜"的方法来处理……