我使用asp.net 4,c#和ef4。
我想知道从实体框架中捕获一般异常的最佳方法是什么。
Exception
这是合适的吗?感谢您的时间。
try
{
context.DeleteObject(myLockedContent);
context.SaveChanges();
}
catch (Exception)
{
e.Cancel = true;
}
答案 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,那么您编写的那个应该放在最后。