【问题标题】:Exception Handling in C# with Entity Framwork 4使用 Entity Framework 4 在 C# 中进行异常处理
【发布时间】:2011-07-13 09:15:33
【问题描述】:

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

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

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

感谢您的宝贵时间。

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

【问题讨论】:

    标签: c# entity-framework entity-framework-4 error-handling


    【解决方案1】:

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

    您可以像处理泛型一样捕获特定的异常类型(尽管您在示例中遗漏了标识符),因此:

    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
    }
    

    【讨论】:

    • 恕我直言InvalidOperationException 是一个不好的例子,因为它几乎永远无法处理。 (几乎因为它可以被滥用)
    • @jgauffin:这只是一个更具体的异常的示例,而不是捕获它的指令。为什么不推荐一个更好的?随意编辑答案以放置它。
    • 完成。 :) 更容易正确处理OptimisticConcurrencyException
    【解决方案2】:

    不要那样做。

    您隐藏了可能严重影响应用程序可靠性的错误。 抛出异常是有原因的,像什么都没发生一样继续下去是错误的。

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

    你应该只使用全部捕获

    a) 当想要在层边界包装异常时(但要包含原始异常)。

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-11-30
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多