带有实体框架4的C#中的异常处理

时间:2011-03-11 09:54:20

标签: c# entity-framework entity-framework-4 error-handling

我使用asp.net 4,c#和ef4。

我想知道从实体框架中捕获一般异常的最佳方法是什么。

  • 目前我使用Exception这是合适的吗?
  • 如何捕捉更具体的一个?

感谢您的时间。

try
{
    context.DeleteObject(myLockedContent);
    context.SaveChanges();
}
catch (Exception)
{
    e.Cancel = true;
}

3 个答案:

答案 0 :(得分:7)

捕获通用异常并取消它们很少。有例外可以帮助您确保代码可以采取适当的行动。

您可以捕获特定的异常类型,就像您对通用一样(尽管您的示例中已经错过了标识符):

catch (OptimisticConcurrencyException ex) 
{
    // Do some real work to resolve the exception
}

catch语句中指定的异常类型告诉运行时捕获特定的和任何子异常。因此,您需要将catch语句从最具体的异常组织到最少,即:

catch (OptimisticConcurrencyException ex) 
{
    // Do some real work to resolve the specific exception
}
...
catch (Exception ex) 
{
    // Do some real work to resolve the generic 'catch-all' exception
}

答案 1 :(得分:5)

不要那样做。

您隐藏了可能严重影响应用程序可靠性的错误。 由于某种原因而抛出异常 ,只是继续,就像没有发生任何事情一样是错误的。

你的方法无法按照承诺返回结果,这会影响使用它的所有代码。但调用方法不会知道异常,并且在最坏的情况下会继续,因为没有发生任何事情,因此会产生不希望的结果。

你应该只使用catch all

a)想要在层边界处包装异常(但包括原始异常)。

b)当异常传播到顶层时(如果未捕获异常,将终止您的应用程序)。

除此之外,只有在处理异常时才能捕获异常 。这意味着通过捕获异常,您可以返回调用者期望的结果。

答案 2 :(得分:2)

你在你的例子中捕获的方式很糟糕,总是在某个地方记录异常,例如在文本文件或SMTPAppender上,你可以使用Log4Net并在很短的时间内运行它,而你的编码很少侧。

这样说,这取决于你是否想要以不同的方式处理不同的异常,例如,如果找不到文件你可以决定创建它或告诉用户做某事,如果抛出更一般的异常,你可能采取不同的行动......

请记住,您应该将所有catch子句从更具体的catch子句放到更通用的子句中,在您的示例中,如果您有多个catch,那么您编写的那个应该放在最后。