2009-11-27 33 views

回答

2

我想,因为我不知道你说的是哪一个分割的例外在下列2种类型:

WCF通信异常:
这些异常可能不会麻烦你的服务器端应用程序。所以你不必担心它们。您只需在客户端应用程序中小心。

应用程序异常:
(显然)你需要抓住他们,否则你的服务器端应用程序会崩溃。

2

是的,你应该 - 无论如何!

首先,服务器端的未捕获的异常将“错误”通道,例如,将客户端和服务器之间的通道置于“恐慌模式” - 不再有可能的呼叫,您需要关闭(或中止)来自客户端的通道并重新建立连接。其次,当然,未处理的异常会使服务器代码崩溃 - 但是,默认情况下,您的WCF调用应该是“每次调用”,也就是说,每次请求都会得到一个全新的,新鲜的实例化你的服务器类的对象,并且在调用结束时,它将被抛弃。所以这真的不是那么糟糕...

在WCF中有一个名为IErrorHandler的接口,您可以在服务器端实现接口。它提供的是捕捉任何异常的能力,并将它们变成“可互操作的”SOAP错误,这些错误将通过通信通道发回,而不会导致它进入恐慌模式。

有几个IErrorHandler实现那里基本上允许您动态地插入作为服务行为 - 无论是在服务器的配置,或在您的服务类代码作为属性。查看this blog post这些样本之一(还有更多 - 只是谷歌为他们)。

+0

@marc_s:我写了一个使用WCF的客户端 - 服务器应用程序,它在过去六个月的生产中(没有停机时间)。我没有在服务器中编写一行代码来捕获** WCF通信异常**。但是,我确实使用了每次通话模式,并且我很想知道如果我将其更改为“每会话”或“单身人士”模式,我将不得不在服务器中进行更改... – Hemant 2009-11-27 10:14:40

+0

虽然从我阅读的任何时间(我在学习WCF的时候),只有“per-call”是有道理的。 – Hemant 2009-11-27 10:16:34

0

预期有例外例外;最好是将它们冒泡为故障(WCF术语 - 查找FaultException),但无论哪种方式,该异常都会简单地转换到网络上并由客户端处理。 WCF客户端真的不喜欢得到异常,这通常是一个代理终端(客户端应该清理他们现有的代理并启动一个新的会话来获得新的会话等)。但是你的服务器进程(减去borked会话)将继续运行并提供服务请求。

当然也有非常讨厌和服务器发生严重异常的一个类别 - 堆栈溢出,内存,线程中止等,但没有太多可以做那些反正