使用实体框架4在C#中进行异常处理

Gib*_*boK 3 c# error-handling entity-framework entity-framework-4

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

我想知道从实体框架中捕获通用异常的最佳方法是什么.

  • 目前我用Exception它是合适的吗?
  • 如何抓住更具体的一个?

谢谢你的时间.

try
{
    context.DeleteObject(myLockedContent);
    context.SaveChanges();
}
catch (Exception)
{
    e.Cancel = true;
}
Run Code Online (Sandbox Code Playgroud)

Laz*_*rus 7

捕获通用异常并取消它们很少有好处.有例外可以帮助您确保代码可以正常运行.

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

catch (OptimisticConcurrencyException ex) 
{
    // Do some real work to resolve the exception
}
Run Code Online (Sandbox Code Playgroud)

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
}
Run Code Online (Sandbox Code Playgroud)

  • 恕我直言`InvalidOperationException`是一个不好的例子,因为它几乎永远不会被处理.(几乎因为它可能被滥用) (2认同)

jga*_*fin 5

不要那样做.

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

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

你应该只使用catch all

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

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

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