谁能解释以下两种方法之间的区别。
登录控制器的 OnException 事件:
try
{
//code
}
catch
{
//rollback trasanctions
throw;
}
或者,登录 catch 块:
try
{
//code
}
catch
{
//logging here
//rollback trasactions
throw;
}
谁能解释以下两种方法之间的区别。
登录控制器的 OnException 事件:
try
{
//code
}
catch
{
//rollback trasanctions
throw;
}
或者,登录 catch 块:
try
{
//code
}
catch
{
//logging here
//rollback trasactions
throw;
}
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-在职