【发布时间】:2009-11-27 02:25:51
【问题描述】:
作为标题,我应该在服务器端捕获异常吗?
【问题讨论】:
作为标题,我应该在服务器端捕获异常吗?
【问题讨论】:
我想将异常分为以下两种类型,因为我不确定你在说哪一种:
WCF 通信异常:
这些异常不太可能给您的服务器端应用程序带来麻烦。所以你不必担心它们。您只需要在客户端应用程序中小心。
应用程序例外:
(显然)您确实需要捕获它们,否则您的服务器端应用程序将崩溃。
【讨论】:
是的,你应该 - 无论如何!
首先,服务器端未捕获的异常将“故障”通道,例如将客户端和服务器之间的通道置于“紧急模式” - 无法再调用,您需要从客户端关闭(或中止)通道并重新建立连接。
其次,当然,未处理的异常会使您的服务器代码崩溃 - 但是,默认情况下,您的 WCF 调用无论如何都应该是“每次调用”,这意味着,每个传入的请求都将获得一个全新的、新实例化的您的服务器类的对象,并且在调用结束时,无论如何它都会被处理掉。所以这真的不是那么糟糕......
WCF 中有一个名为IErrorHandler 的接口,您可以在服务器端实现该接口。它提供的是捕获任何异常并将它们转换为“可互操作”的 SOAP 错误的能力,这些错误将通过通信通道发送回,而不会导致它进入恐慌模式。
有几个IErrorHandler 实现基本上允许您将其作为服务行为动态插入 - 无论是在服务器的配置中,还是在您的服务类代码中作为属性。查看 this blog post 获取其中一个示例(还有更多示例 - 只需 google 即可)。
【讨论】:
预计会出现例行异常;最好将它们冒泡为 faults(WCF 术语 - 查找 FaultException),但无论哪种方式,异常都会简单地转换到网络上并由客户端处理。 WCF 客户端真的不喜欢获得异常,这通常是代理的终端(客户端应该清理他们现有的代理并启动一个新的代理以获得新的会话等)。但是您的服务器进程(减去 borked 会话)将继续运行并为请求提供服务。
当然有一类非常讨厌和服务器致命的异常 - 堆栈溢出、内存不足、线程中止等。但是对于这些,您无能为力无论如何 !
【讨论】: