我应该采取什么方法来处理非泛型异常?
本文关键字:泛型 异常 处理 什么 方法 我应该 | 更新日期: 2023-09-27 17:51:01
我编写的代码中,出于防御目的,我将try-catch
中的所有方法体封闭在catch
块中捕获通用Exception
。
现在我已经编写了接受Exception
类型对象的方法,然后记录基本异常类型,异常消息和堆栈跟踪。然后迭代地遍历内部异常,并为它们打印相同的异常。所以简而言之,无论在任何地方发生什么异常,我都可以获得日志中所有嵌套异常的基本类型,消息和堆栈跟踪。
我已经捕获了所有地方的非泛型异常,Visual Studio给了我异常未捕获的警告。但是这些人的数量非常少。
然而,它们是在测试运行中调用方法的实例:
ExchangeService.LoadPropertiesForItems ()
我得到了以下堆栈跟踪
2014-03-18 16:59:09.3816 | Error | The request failed. Unable to connect to the remote server
Immediate Stack Trace
===================================================================================
Microsoft.Exchange.WebServices.Data.ServiceRequestException : The request failed. Unable to connect to the remote server
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.ValidateAndEmitRequest(IEwsHttpWebRequest& request)
at Microsoft.Exchange.WebServices.Data.MultiResponseServiceRequest`1.Execute()
at Microsoft.Exchange.WebServices.Data.ExchangeService.FindItems[TItem](IEnumerable`1 parentFolderIds, SearchFilter searchFilter, String queryString, ViewBase view, Grouping groupBy, ServiceErrorHandling errorHandlingMode)
at Microsoft.Exchange.WebServices.Data.ExchangeService.FindItems(FolderId parentFolderId, SearchFilter searchFilter, ViewBase view)
at Microsoft.Exchange.WebServices.Data.ExchangeService.FindItems(WellKnownFolderName parentFolderName, ViewBase view)
at com.cos.method() in c:'SW'Class.cs:line 268
Inner Exception 1 : Stack Trace
-----------------------------------------------------------------------------
Unable to connect to the remote server
at System.Net.HttpWebRequest.GetResponse()
at Microsoft.Exchange.WebServices.Data.EwsHttpWebRequest.Microsoft.Exchange.WebServices.Data.IEwsHttpWebRequest.GetResponse()
at Microsoft.Exchange.WebServices.Data.ServiceRequestBase.GetEwsHttpWebResponse(IEwsHttpWebRequest request)
Inner Exception 2 : Stack Trace
-----------------------------------------------------------------------------
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond 10.40.7.29:443
at System.Net.Sockets.Socket.EndConnect(IAsyncResult asyncResult)
at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)
此方法的MSDN页没有指定它可以抛出ServiceRequestException
或Visual Studio显示任何警告。
而且,我公司的自动代码分析工具为这种泛型异常捕获块生成了大量的警告。
我应该如何处理这种异常的发生?
将整个工作流包装在try-catch中似乎是防止意外异常导致代码崩溃或导致意外下游影响的最佳方法。通常情况下,这是一个安全层,它模糊了您实际如何处理已知问题的特定异常。
冒泡了就何时起泡和何时捕获异常的标准而言,看看您的工作流,当更高级别的方法可能有更好的上下文来决定如何处理特定的异常时,在较低级别的方法中捕获异常可能没有意义。例如,我可以让一个算术函数抛出一个未处理的异常,这样我就可以在调用它的服务中捕获它,这将更好地知道我应该如何处理这个特定的异常,也许我将调用一个不同的函数,或者传递一个精炼的异常消息,等等,所有这些选项在低级方法中不一定可用或有意义。
多个异常处理
当你捕获异常时,最好的做法通常是捕获特定的异常,并为每种异常类型提供单独的处理,如上面的例子ServiceRequestException泛型处理可能是这样的。
try{
//Do Your Work
}
catch(ServiceRequestException srex)
{
//Handle this Specific Exception Type
}
catch(StackOverflowException soex)
{
//Handle this Specific Exception Type
}
catch(SomeOtherSpecificException sose)
{
//Handle this Specific Exception Type
}
catch(Exception ex)
{
//Handle an Unexpected Exception
}
在这个异常定义中,我将异常按最具体到最不具体排序。我确实在最后包含了通用异常,虽然它总是更好地捕获预期的特定异常,对于某些用例来说,防止任何异常逃逸可能是头等大事,例如web开发将永远不希望异常逃逸,以改善用户体验。如果你必须处理泛型异常,请确保你有适当的异常日志。
异常日志
听起来你已经有了一个日志方法,但我还是要提一下。对于。net log4Net和Common,有很多很棒的日志选项。日志记录是我经常使用的。也有例外特定的记录器,如Elmah。需要注意的一件重要事情是,日志记录允许您指定各种级别和通信方法。这将允许将粒度应用于异常管理,因此异常,特别是您期望发生的异常,可能比一般异常具有较低的优先级。能够将未正确处理的异常弹出到顶部,或者使用电子邮件或更直接的异常通信形式将帮助您更好地响应异常,并在代码中实现更好的异常处理。
如果发现意外异常,请确保为它们添加特定的catch方法,并使用特定的异常处理。希望这对你有所帮助。这里有一篇代码项目文章,里面有1337个关于异常管理的专业技巧,我在这里提到的那些我认为最符合你的问题,但这篇文章也值得一读。
http://www.codeproject.com/Articles/9538/Exception-Handling-Best-Practices-in-NET不% 27 teverswallowexceptions13