使用IErrorHandle对WCF服务器进行异常处理

概述:

在实际的项目开发中,我们常常会处理各种各样的异常,在代码中不断充斥着try{}catch{}finally{}语句块,这些处理有些时候是不可缺少的,因为谁都没有办法保证自己写的代码无异常运行,外部环境造成了异常存在的可能性,但是我常常觉得,捕获异常的语句块经常把原本清晰的业务逻辑弄得七零八落的,当然,本篇的目的不是说异常捕获可完全避免,但到少WCF可以让我们稍微从异常处理中得到一点解脱。

1、首先来看常规的服务实现类在处理异常时的做法,下面是常规的捕获了一个除数为0的异常。

常规异常捕获

public string Div(int x,int y)
     {
       int result=0;
       try
       {
         result = x / y;
       }
       catch (DivideByZeroException ex)
       {
         throw ex;
       }
       return string.Format("{0}",result);
     }

2、再看看应用了IErrorHandler接口来处理异常后的代码。

public string Div(int x,int y)
     {
       return string.Format("{0}",x/y);
     }

有爽的感觉吗?如果没有,请仔细想想1000个方法中的异常处理。这就是WCF让程序自己抛出异常并自行捕获。

3、如何实现?

3.1、要达到上述的效果,我们需要自定义一类并实现IErrorHandler接口,代码相当的简单,如下:

public class FaultErrorHandler : IErrorHandler
   {
     #region IErrorHandler 成员
     public bool HandleError(Exception error)
     {
       // TO DO 在这里可以做日志记录等。
       Console.WriteLine("Message:{0},StackTrace:{1}",error.Message,error.StackTrace);
       return true;
     }
     public void ProvideFault(Exception error,MessageVersion version,ref Message fault)
     {
       FaultException fe = new FaultException(error.Message,FaultCode.CreateReceiverFaultCode(error.Source,error.StackTrace));
       MessageFault messagefault = fe.CreateMessageFault();
       fault = Message.CreateMessage(version,messagefault,"http://www.microsoft.com/");
     }
     #endregion
}

只有十来行代码,相当于我们以前的创建日志文件代码。

时间: 2024-10-01 08:44:44

使用IErrorHandle对WCF服务器进行异常处理的相关文章

WCF中的异常处理

异常消息与特定技术有关,.NET异常同样如此,因而WCF并不支持传统的异常处理方式.如果在WCF服务中采用传统的方式处理异常,由于异常消息不能被序列化,因而客户端无法收到服务抛出的异常,例如这样的服务设计: [ServiceContract(SessionMode = SessionMode.Allowed)] public interface IDocumentsExplorerService { [OperationContract] DocumentList FetchDocuments(

WCF技术剖析之二十一: WCF基本的异常处理模式[上篇]

由于WCF采用.NET托管语言(C#和NET)作为其主要的编程语言,注定以了基于WCF的编程方式不可能很复杂.同时,WCF设计的一个目的就是提供基于非业务逻辑的通信实现,为编程人员提供一套简单易用的应用编程接口(API).WCF编程模式的简单性同样体现在异常处理上面,本篇文章的主要目的就是对WCF基于异常处理的编程模式做一个简单的介绍. 一.当异常从服务端抛出 对于一个典型的WCF服务调用,我个人倾向于将潜在抛出的异常费为两种类型:应用异常(Application Exception)和基础结构

求助#有关wcf服务器

问题描述 在下算是个新手,没有搜到我的问题,发帖求助一下.问题如下:我在一个公司内实习,要求对他们的现有程序进行修改,目标是将其中一个通许服务器写入到局域网主机中,在另一台电脑上运行其他相关服务器,并在iis上配置该网站.我已经将通讯服务器应用程序装在主机中,并对程序进行了更改,终结点也进行了修正,之后在自己的电脑上打开网页也都可以正常运行,网页地址是以localhost开头的,我想在局域网其他电脑上也能够运行该网站,因此我尝试将地址中的localhost改为本机的ip地址(127.0.0.1我

WCF技术剖析之二十一:WCF基本异常处理模式[中篇]

通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WCF传递到客户端:如果将开启了IncludeExceptionDetailInFaults的ServiceDebug服务行为通过声明(通过在服务类型上应用ServiceBehaviorAttrite特性)或者配置的方式应用到相应的服务上,异常相关的所有细节信息将会原封不动地向客户端传送. 这两种方式体

WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?

原文:WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗? 在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起的,大家平时工作可能只是去调用和修改WCF的一些方法,而并未创建和配置过WCF,如果大家通过网上的教程去一步一步的创建和配置WCF,中途遇到错误,特别是WCF的配置这块很容易出错,难免会浪费时间.今天,我们就主要来说一

WCF基本异常处理模式[中篇]

通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WCF传递到客户端:如果将开启了IncludeExceptionDetailInFaults的ServiceDebug服务行为通过声明(通过在服务类型上应用ServiceBehaviorAttrite特性)或者配置的方式应用到相应的服务上,异常相关的所有细节信息将会原封不动地向客户端传送. 这两种方式体

WCF服务全局统一异常处理机制

转载:http://www.csframework.com/archive/1/arc-1-20150109-2193.htm 服务端增加WCF服务全局异常处理机制,任一WCF服务或接口方式出现异常,将统一调用WCF_ExceptionHandler.ProvideFault方法,因此不需要每个方法使用try catch写法. C# Code: /// <summary> /// WCF服务端异常处理器 /// </summary> public class WCF_Excepti

艾伟_转载:WCF基本异常处理模式[中篇]

通过WCF基本的异常处理模式[上篇], 我们知道了:在默认的情况下,服务端在执行某个服务操作时抛出的异常(在这里指非FaultException异常),其相关的错误信息仅仅限于服务端可见,并不会被WCF传递到客户端:如果将开启了IncludeExceptionDetailInFaults的ServiceDebug服务行为通过声明(通过在服务类型上应用ServiceBehaviorAttrite特性)或者配置的方式应用到相应的服务上,异常相关的所有细节信息将会原封不动地向客户端传送. 这两种方式体

WCF技术剖析之二十四:ServiceDebugBehavior服务行为是如何实现异常的传播的?

服务端只有抛出FaultException异常才能被正常地序列化成Fault消息,并实现向客户端传播.对于一般的异常(比如执行Divide操作抛出的DivideByZeroException),在默认的情况下,异常信息无法实现向客户端传递.但是,倘若为某个服务应用了ServiceDebugBehavior这么一个服务行为,并开启了IncludeExceptionDetailInFaults开关,异常信息将会原封不动地传播到客户端.WCF内部是如何处理抛出的非FaultException异常的呢?