包含下面内容

1 WCF异常处理的方式

2其他错误方式

3 IncludeExceptionDetailInFaults

 

1.         WCF异常处理的方式

异常处理是开发过程中处理特殊情况的最有效方式,和C++返回错误码的方式相比,异常处理的扩展性更强,使用起来更灵活,代码的可读性更强。

WCF由于部署和开发的特殊性,异常处理引入了SOAP方式的异常,即FaultException。使得抛出的异常不受平台的约束。

 

在标准的.net应用中抛出异常的方式是

            throw new InvalidOperationException("dafsdfasdfasdfasdfa");

 

在客户端捕获这个异常。

 

但是在WCF平台下,如果在服务器端抛出这个异常,在客户端是收不到这个类型的异常的。因为服务器端不知道客户端的平台类型,可能是.net,也可能是java,还可能是C++。因此为了实现WCF的客户端与平台无关这个目的,WCF提供了FaultException。这个类型是基于SOAP方式实现的。

如果想在服务端抛出异常,需要:

            throw new FaultException<MyException>(e);

FaultException的泛型类型是自定义的数据契约

    [DataContract]
    public class MyException
    {
        [DataMember]
        public string Message
        {
            get { return this.report; }
            set { this.report = value; }
        }
        string report;
     }

这样在客户端,可以采用这样的方式捕获

 

            try
            {
                exception.ThrowCLRException();
            }
            catch (FaultException<ClientConsole.Exception.MyException> e)
            {
                Console.WriteLine("捕获到FaultException<MyException>异常");
            }

2.         其他错误方式

 

为什么需要自定义一个异常类型呢?用.net内置的异常类型不行吗?如下面:

            InvalidOperationException e = new InvalidOperationException(

            "dfasdfasdfa",

            new DivideByZeroException("dasafsdfasd"));

            throw new FaultException<InvalidOperationException>(e);

 

如果服务器像上面这样抛出异常,客户端不会收到InvalidOperationException类型的异常,也不会收到FaultException<InvalidOperationException>的异常,而是CommunicationException的异常。异常的内容是

{"套接字连接已中止。这可能是由于处理消息时出错或远程主机超过接收超时或者潜在的网络资源问题导致的。本地套接字超时是“:00:59.9840000”。"}

 

 

如果按照原始的方式抛出异常,客户端又会怎样呢?

            throw new InvalidOperationException("dafsdfasdfasdfasdfa");

 

客户端也会得到CommunicationException异常,异常的内容是

通信对象System.ServiceModel.Channels.ServiceChannel 无法用于通信,因为其处于“出错”状态。

 

由此看来,使用自定义异常类型,并且抛出FaultException,是唯一的方式

 

3.         IncludeExceptionDetailInFaults

WCF在服务的行为上提供了IncludeExceptionDetailInFaults属性。默认值为false。如果在调试时,将IncludeExceptionDetailInFaults置为true,可以让客户端收到FaultException类型的异常,而不是FaultException<MyException>。

IncludeExceptionDetailInFaults带来的好处是能更早的发现异常。例如如果客户端采用FaultException<MyException>捕获异常,就处理了这个异常。开发人员不一定立刻就知道这个异常。如果将IncludeExceptionDetailInFaults置为true,由于没有捕获FaultException异常,客户端就会立刻抛出一个未处理的FaultException异常,这样开发人员就能立刻发现错误。

 posted on 2010-07-30 13:18  刘卓  阅读(1078)  评论(0编辑  收藏  举报