繁体   English   中英

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

[英]Exception Handling in C# with Entity Framwork 4

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

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

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

谢谢你的时间。

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

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

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

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
}

不要那样做。

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

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

你应该只使用catch all

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

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

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

您在示例中捕获的方式很糟糕,总是在某处以某种方式记录异常,例如在文本文件或SMTPAppender上,您可以使用Log4Net并在很短的时间内以最少的编码来运行它。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM