1

谁能解释以下两种方法之间的区别。

登录控制器的 OnException 事件:

try
{
    //code         
}
catch
{
    //rollback trasanctions
    throw;
}

或者,登录 catch 块:

try
{
    //code   
}
catch
{
   //logging here
   //rollback trasactions
   throw;
}
4

1 回答 1

1

OnException当处理请求时发生未处理的异常时,使用Controller的方法。它指示如果发生意外异常应该发生什么功能。你真的应该只在你搞砸或系统以意想不到的、致命的方式失败的情况下使用它作为保护措施。

如果您正在执行一些您希望抛出特定异常的代码,请将其包装在try块中,并相应地处理特定异常。这种防御方法将帮助您在问题发生时立即对其进行调试,而不是等待它们冒泡到您不知道原因的地步。

想一想,如果您有多个操作方法并且OnException每个控制器只有一个方法,那么您需要处理一个更复杂的问题,因为任何操作方法或过滤器都可能引发错误。但是,如果您捕获了由特定服务调用调用的异常,那么您已经确切地知道是什么导致了意外行为,并且相应地解决它会容易得多。

阅读此内容以获得更好的理解: Eric Lippert 有一篇出色的文章,他在其中分解了我们遇到的不同类别的异常,并提供了解决它们的最佳实践。它位于http://blogs.msdn.com/b/ericlippert/archive/2008/09/10/vexing-exceptions.aspx。如果你不知道 Eric Lippert 是谁,他很聪明,如果你用 C# 编写代码,你应该听他的。他的主要观点是:

  • 不要捕获致命异常;无论如何,您对它们无能为力,并且试图通常会使情况变得更糟。

  • 修复您的代码,使其永远不会触发愚蠢的异常——“索引超出范围”异常不应该在生产代码中发生。

  • 通过调用那些在非异常情况下抛出的令人烦恼的方法的“尝试”版本,尽可能避免令人烦恼的异常。如果你无法避免调用一个令人头疼的方法,请捕获它令人头疼的异常。

  • 始终处理表示意外外部条件的异常;一般来说,预测每一个可能的失败是不值得或不切实际的。只需尝试操作并准备处理异常。

更新

刚刚意识到我没有明确解决“日志记录”问题。避免在控制器范围内处理致命/外生错误可能最有意义,因为您最终会经常重复您的逻辑。在全局操作过滤器中可以更好地处理此行为。

这篇 codeproject 文章ASP.NET MVC 中的异常处理解释了如何覆盖默认值HandleErrorAttribute并利用 anErrorController以便可以全局应用它。

此外,以下 5 部分博客系列深入分析了 MVC 应用程序中错误处理的不同选项:http: //perspectivespace.com/error-handling-in-aspnet-mvc-3-index-在职

于 2012-09-08T00:17:52.667 回答