当前位置: 首页 > 编程语言 > C#

ExceptionHandlingwithHttpModule分享

时间:2023-04-10 23:45:06 C#

ExceptionHandlingwithHttpModule我们在回顾公司系统的一个异常处理,发现了一些有趣的东西。大多数(如果不是全部)代码块都在try/catch块内,并且在catch块内抛出一个新的BaseApplicationException-这似乎来自企业库。我在这里遇到了一些麻烦,因为我看不到这样做的好处。(另一个异常随时发生)一位一直在使用该系统的开发人员说这是因为类负责发布异常(发送电子邮件和类似的东西),但他不太确定。在花了一些时间查看代码后,我可以非常自信地说,这都是关于收集有关环境的信息,而不是发布信息。我的问题是:-将所有代码包装在try{}catch{}块中并抛出新异常是否合理?如果是,为什么?有什么好处?个人认为使用HttpModule,注册Application事件的Error事件,在模块内部进行必要的操作会更简单。如果我们走这条路,我们会错过什么吗?有什么缺点吗?非常感谢您的意见。永远不要抓住(Exceptionex)。时期2.您无法处理可能遇到的所有不同类型的错误。如果您无法处理或提供额外信息(供后续异常处理程序使用),则永远不要捕获异常派生类型。显示错误消息与处理错误不同。我想到了以下几个原因:如果您知道如何处理特定异常(并将应用程序重置为错误前的状态),请捕获它。(这就是它被称为异常处理的原因。)要处理未捕获的异常,请监听相应的事件。在执行WinForms时,您需要侦听System.AppDomain.CurrentDomain.UnhandledException,并且-如果您正在执行线程-System.Windows.Forms.Application.ThreadException。对于web应用程序,有一个类似的机制(System.Web.HttpApplication.Error)。至于在应用程序(非)特定异常(即thrownewMyBaseException(ex);)中包装框架异常:完全没有意义,而且味道不好。4Edits1@Chris在评论中指出never是一个非常苛刻的词,尤其是在工程方面。当我第一次写这个答案时,我会承认我的原则很高。2,3参见1。4如果你没有带来任何新东西,我仍然坚持这个。如果您已经将Exceptionex作为您知道可能以多种方式失败的方法的一部分,我相信当前方法应该反映其签名。如您所知,异常不是方法签名的一部分。如果我正确地阅读了这个问题,我会说实现一个拦截异常的try/catch(你没有提到-它捕获所有异常,还是只捕获一个特定的异常?)并抛出一个不同的异常通常是不好的事物。缺点:至少您会丢失堆栈跟踪信息——您将看到的堆栈仅扩展到抛出新异常的方法——并且您可能会丢失一些有用的调试信息。如果您正在捕获异常,则可能会冒用不太严重的异常屏蔽严重异常的风险,例如OutOfMemory或StackOverflow,从而使进程在可能应该被拆除时保持运行。可能的优势:在一些非常特殊的情况下,您可以采用没有太多调试价值的异常(例如从数据库返回的某些异常)并用异常包装它,这会添加更多上下文,例如您正在处理的对象与身份证。然而,在几乎所有情况下,这是一种难闻的气味,应谨慎使用。一般来说,只有当你在那个地方有一些现实的东西时,你才应该捕获异常——即恢复、回滚、计划B等。如果没有什么可做的,就让它通过链。如果在该位置有可用的特定有用数据来扩充原始异常并因此有助于调试,则您应该只捕获并抛出一个新异常。我来自一个思想流派,应该使用try/catch块而不是重新抛出异常。如果您正在执行可能出错的代码,那么应该处理、记录和返回某些内容。重新抛出异常只是为了在应用程序生命周期的后期重新记录。这是一篇关于如何使用HttpModule处理异常的有趣帖子:http://blogs.msdn.com/rahulso/archive/2008/07/13/how-to-use-httpmodules-to-troubleshoot-your-asp-net-application.aspx和http://blogs.msdn.com/rahulso/archive/2008/07/18/asp-net-how-to-write-error-messages-into-a-text-file-using-A-简单的httpmodule.aspx看看ELMAH。它做你在说什么。非常好。当我创建库时,我尝试始终为调用者提供更少数量的异常来处理。例如,考虑一个连接到sql数据库的存储库组件。从sqlclientexception到invalidcastexception,理论上是可以抛出异常的。其中许多都清楚地记录在案,可以在编译时说明。因此,我尽可能多地捕获它们,将它们放入RepositoryException之类的异常类型中,然后让该异常累积调用堆栈。原来的异常被保留下来,所以可以诊断。但是我的调用者只需要担心处理一种异常类型的代码,而不是用大量不同的catch块将它们扔掉。当然,这也存在一些问题。最值得注意的是,如果调用者可以处理其中一些异常,则他们必须查看RepositoryException,然后打开内部异常的类型来处理它。对于单个异常类型,它不如单个catch块干净。但是,我认为这不是一个大问题。听起来抛出的异常不应该作为异常实现。无论如何,我会说因为这个BaseApplicationException是一个通用的多用途异常,所以最好抛出一些更特定于上下文的东西。因此,当您尝试从数据库中检索实体时,您可能需要EntityNotFoundException。这样,在调试时,您不必搜索内部异常和堆栈跟踪来查找真正的问题。如果此BAseApplicationException正在收集有关异常的信息(如跟踪内部异常),那么这应该不是问题。我仅在无法接近代码中实际发生异常的位置时才使用HttpModule。根据BaseApplicationexception的错误消息,您确实不希望HttModuleOnError事件成为一个巨大的switch语句。总而言之,当您可以提供更具体的异常时,可以抛出不同的异常,直接告诉您问题的根源。根据我的经验,异常被捕获,错误被添加到Server(?)对象。这将允许.NET执行它需要执行的操作,然后显示您的异常。以上就是C#学习教程:使用HttpModule进行异常处理分享。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: