文章最后给出正确捕获异常的捕获顺序。本次异常捕获仅为介绍,部分为应用性功能,所以代码和行文相对简单,还介绍了在服务器端异常处理的一些技巧。
1、首先,我们创建一个简单的计算器服务器和客户端,如下:
点击展开代码
//服务器
[ServiceContract]
public interface ICalc
{
[OperationContract]
[FaultContract(typeof(GreentingError))]
string Div(int x, int y);
}
public class Calc : ServiceBase, ICalc
{
public string Div(int x, int y)
{string result = string.Empty;
try
{result = string.Format("result: {0}", x / y); } catch (DivideByZeroException ex)
{throw ex; }return result; }}
//客户端
[ServiceContract]
public interface ICalc
{
[OperationContract]
[FaultContract(typeof(GreentingError))]
string Div(int x, int y);
}
public class CalcClient : ClientBase<ICalc>, ICalc
{ public string Div(int x, int y) {return base.Channel.Div(x, y); }}
好吧,我承认代码相当的简单,不过我喜欢简洁的东西。
2、简单的东西就是好,调用都简单得多;我们来调用一下。
try
{
CalcClientcalcclient = new CalcClient();
string result =calcclient.Div(10, 0);
Console.WriteLine(result);
Console.ReadKey();
}
catch (TimeoutExceptionex) {throw ex; }
catch (FaultException<GreentingError> ex) {throw ex; }
catch (FaultExceptionex) {throw ex;
catch (System.ServiceModel.CommunicationException ex) {throw ex; }
catch (Exceptionex) {throw ex; }
3、当我们在调用服务的Div(int x,int y)方法并给对数y传递了值为0后,服务器端将会引发DivideByZeroException的异常,这在预料之中。这时候,
在客户端的FaultException部分捕获了这个异常。
4、没问题,我们再在服务器代码中手动抛出FaultException异常。
catch (DivideByZeroException ex)
{FaultException exception = new FaultException(ex.Message); throw exception;}
这时候发现,还是FaultException捕获了这个异常,为何?