我使用asp.net 4,c#和ef4。在C#中使用实体框架异常处理4
我想知道什么是捕获实体框架中的泛型异常的最佳方法。
- 目前我用
Exception
它是合适的吗? - 如何捕获更具体的?
谢谢你的时间。
try
{
context.DeleteObject(myLockedContent);
context.SaveChanges();
}
catch (Exception)
{
e.Cancel = true;
}
我使用asp.net 4,c#和ef4。在C#中使用实体框架异常处理4
我想知道什么是捕获实体框架中的泛型异常的最佳方法。
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 (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
}
你在你的例子正赶上方式是不好的,总是记录异常的地方,并以某种方式,例如在一个文本文件或一个SMTPAppender,您可以使用log4net的,并得到它在很短的时间内运行与最小编码从你身边。
这样说,它的确取决于您是否想要以不同的方式处理不同的异常,例如,如果找不到文件,您可以决定创建它或告诉用户执行某些操作,如果抛出更一般的异常可能会采取不同的行动...
只是要记住,你应该把所有的catch子句从更具体到更通用的一个,在你的例子中,如果你有多个catch,你写的应该放在结束。
不要这样做。
您在隐藏可能严重影响应用程序可靠性的错误。 由于某种原因引发的例外,只是继续就像没有发生任何事情是错误的。
你的方法不能按照承诺返回结果,这会影响所有使用它的代码。但调用方法不会知道异常情况,并且在最坏的情况下会继续,因为什么也没有发生,因此产生了不希望的结果。
,才应使用捕捉所有
一)想时,在包层边界异常(但确实包含原始异常)。 b)当异常传播到顶层时(如果异常未被捕获,它将终止你的应用程序)。
除此之外,只捕获异常时,你可以处理它们。这意味着,通过捕获异常,您可以返回调用者期望的结果。
恕我直言'InvalidOperationException'是一个不好的例子,因为它几乎永远不能被处理。 (几乎可以被误用) – jgauffin 2011-03-11 10:12:39
@jgauffin:这只是一个更具体的例外情况,并不是指令。为什么不建议更好的?随意编辑答案放置它。 – Lazarus 2011-03-11 10:19:20
完成。 :)正确处理'OptimisticConcurrencyException'有点容易 – jgauffin 2011-03-11 10:31:03