2011-03-11 75 views
3

我使用asp.net 4,c#和ef4。在C#中使用实体框架异常处理4

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

  • 目前我用Exception它是合适的吗?
  • 如何捕获更具体的?

谢谢你的时间。

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

回答

7

捕获泛型异常并取消它们很少有用。例外情况可以帮助您确保代码可以正确执行。

你可以这样赶上就像你有通用(虽然与标识符你已经错过了你的例子)具体的异常类型:

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

在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 
} 
+2

恕我直言'InvalidOperationException'是一个不好的例子,因为它几乎永远不能被处理。 (几乎可以被误用) – jgauffin 2011-03-11 10:12:39

+0

@jgauffin:这只是一个更具体的例外情况,并不是指令。为什么不建议更好的?随意编辑答案放置它。 – Lazarus 2011-03-11 10:19:20

+0

完成。 :)正确处理'OptimisticConcurrencyException'有点容易 – jgauffin 2011-03-11 10:31:03

2

你在你的例子正赶上方式是不好的,总是记录异常的地方,并以某种方式,例如在一个文本文件或一个SMTPAppender,您可以使用log4net的,并得到它在很短的时间内运行与最小编码从你身边。

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

只是要记住,你应该把所有的catch子句从更具体到更通用的一个,在你的例子中,如果你有多个catch,你写的应该放在结束。

5

不要这样做。

您在隐藏可能严重影响应用程序可靠性的错误。 由于某种原因引发的例外,只是继续就像没有发生任何事情是错误的。

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

,才应使用捕捉所有

一)想时,在包层边界异常(但确实包含原始异常)。 b)当异常传播到顶层时(如果异常未被捕获,它将终止你的应用程序)。

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