先来说说SOAP消息中错误消息的包装结构,一条SOAP错误消息的大致形式如下:

    <s:Fault><faultcode xmlns:a="me-cust-error">a:错误码</faultcode><faultstring xml:lang="zh-CN">错误内容。</faultstring>      ……</s:Fault>

首先是Fault元素,然后下面是错误消息相关联的子元素。在上一篇烂文中,老周曾介绍过FaultReason,这个类用于包装错误文本信息,并且支持多种语言。上面所展示的Fault元素中,faultstring子元素中的内容就是FaultReason类所指定的文本。

大伙伴们可能已经发现了,Fault元素下还有一个叫 faultcode 的子元素,它便是本文的主角,我们可以直接“望文生义”地将其翻译为错误码。错误码是干吗的?大伙应该知道 HTTP 中的错误代码,如我们经常看到的 404- not found,道理也是一样的, SOAP 消息中的错误码就是用来对某一类错误进行标识的,通常用一些简洁的短语,以便于识别。比如,一个错误命名为(错误码)RPTooLow,你一看到这条错误,就知道是因为用户的人品太差而导致操作失败。

Fault code的命名就是一个字符串,你可以自己来取,当然应当取一些有意义的名字,不能只有你自己看得懂而别人摸不着头脑,除非你的应用程序不打算对外公开错误信息。

在 WCF 中,可以用 FaultCode 类来定义错误码,然后把该类的实例传递给 FaultException 的构造函数就 OK 了。

下面老周举一个例子,假设有一个服务,它的功能是计算一个整数值的平方。其服务协定声明如下。

    [ServiceContract]public interface IDemo{[OperationContract]int Sqr(int n);}

然后实现这个服务协定。

    class DemoService : IDemo{public int Sqr(int n){if (n <= 0){FaultCode code = new FaultCode("ArgErr", "me-cust-error");FaultReason reason = new FaultReason("传入的参数必须大于0。");throw new FaultException(reason, code);}return n * n;}}

在上面的代码中,注意 Sqr 方法,在方法里面对传入的参数进行一下验证,以确保值是大于0的。要是值不符合要求,就会抛出异常。

在抛出异常的时候,用 FaultCode 来定义一个错误码,构造函数的第一个参数是错误码的名字,第二个参数是XML命名空间,这个也是可以自己定义的。

下面,咱们调用一下这个服务,并故意传一个错误的参数,以便可以捕捉到异常。

            ChannelFactory<IDemo> fac = new ChannelFactory<IDemo>(binding, new EndpointAddress(svaddr));fac.Endpoint.EndpointBehaviors.Add(new MyEndpointBehavior());IDemo channel = fac.CreateChannel();try{int res = channel.Sqr(-5);Console.WriteLine("计算结果:{0}", res);}catch (FaultException fex){FaultReason reason = fex.Reason;FaultReasonText rtext = reason.GetMatchingTranslation();FaultCode code = fex.Code;string errmsg = $"\n错误:{rtext.Text}\n错误代码:{code.Namespace}:{code.Name}";Console.WriteLine(errmsg);}finally{fac.Close();}

这段代码不是很复杂,应该不用我多解释了,重点是捕捉的异常类型应当为 FaultException ,这个老周在上一篇文章中说过的。

运行的结果如下图所示。

示例代码下载地址:点击下载

这篇文章老周是坐在屋顶上用 Surface 敲出来的。老周本来是拿着葫芦丝到房顶上娱乐一下,吹奏了几首曲子后,就打开 Surface 上上网,一时兴起,就写了本篇博客。

【WCF】错误处理(二):错误码―—FaultCode相关推荐

  1. LoadLibrary下错误返回126错误码排查过程

    在开发一些Windows下的应用程序过程中,经常会手动加载一些DLL,使用的就是LoadLibrary这个函数,而这个函数一旦失败,返回的错误码基本都是126,126错误码的意思是找不到指定的模块,这 ...

  2. 用jquery调用wcf下的各种错误码的解释。

    连接出错了,很正常,http请求的xmlhttp异常在i不同的浏览器下是不一样的,下面是ie的报错代码 IE status Error codes: 1223 : Client canceled re ...

  3. HTTP 错误代码表_HTTP 错误码大全

    所有 HTTP 状态代码及其定义. 代码 指示  2xx 成功  200 正常:请求已完成.  201 正常:紧接 POST 命令.  202 正常:已接受用于处理,但处理尚未完成.  203 正常: ...

  4. 什么是好的错误消息? 讨论一下Java系统中的错误码设计

    简介:一个好的Error Message主要包含三个部分:Context: 什么导致了错误?发生错误的时候代码想做什么?The error itself: 到底是什么导致了失败?具体的原因和当时的数据 ...

  5. 转!!CMPP 网关错误码说明

    http://www.163duanxin.com/msg/1753.htm CMPP错误码说明 与中国移动代码的对应关系.  MI::zzzz SMSC返回状态报告的状态值为EXPIRED MJ:z ...

  6. Springboot项目错误码的设计与实现

    HTTP状态码和我们平时的错误码不同,状态码太少了,无法满足我们业务中的需求. 然而,所有请求都返回200,然后数据体里包含错误码的方式,又抛弃了HTTP状态码,抛弃了普遍共识. 本来应该遵照HTTP ...

  7. 海康工业相机SDK错误码常见场景解析

    在使用SDK二次开发过程中,接口的调用往往会遇到较多的错误,sdk错误码能够帮助我们快速分析错误原因,解决问题,针对常见的错误码,下面给出一下常见的问题原因,供大家分析 1.MV_OK 0x00000 ...

  8. 【Linux系统编程】快速查找errno错误码信息

    我们都知道,errno整型变量被普遍应用于*NIX C的异常处理中,其记录了最近一次的错误码.通过判断错误码的值,以此执行不同的错误处理,这是C语言典型的异常处理方式.其错误名称,比如EAGAIN.E ...

  9. NET_DVR_GetErrorMsg 返回最后操作的错误码信息

    官网链接 NET_DVR_GetErrorMsg 返回最后操作的错误码信息. char * NET_DVR_GetErrorMsg( LONG * pErrorNo ); 参量 pErrorNo [o ...

最新文章

  1. 元宇宙该如何发展才不会变为泡沫
  2. Prolog基本程序
  3. java切割文件_Java如何将大文件切割成小文件
  4. Torque2D MIT 实战记录: 塔防进度(3)
  5. vecm模型怎么写系数_用Stata搞实证之面板模型入门
  6. Linux下同步网络时间
  7. matlab 2010 工具箱,Matlab2010下使用FULLBNT工具箱實現簡單的靜態貝葉斯網絡及推理...
  8. 非对称卷积—Asymmetric Convolutions
  9. 华为hs8145v5如何改桥接_口译vlog | 跟我一起去华为东莞“欧洲小镇”吧!
  10. 布局--------动态添加 相对布局
  11. 青花瓷Charles安装
  12. 【车牌识别】基于HOG特征提取和GRNN网络的车牌识别算法matlab仿真
  13. 14.STC15W408AS单片机IIC驱动OLED
  14. 用计算机怎么计算税率表,个税税率表计算器
  15. 又发现个新的全网资源搜索神器
  16. xp系统计算机怎么连接到网络打印机,老司机教你win7如何连接共享xp打印机
  17. Linux磁盘挂载、扩容、删除
  18. 详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法
  19. 【嵌入式】任意波特率的合理计算——高波特率、低误差
  20. Vue3.0 使用 ref 判断目标 node 区域之外的点击事件(实现下拉框、弹窗关闭功能)

热门文章

  1. 【操作系统】线程的实现-思维导图
  2. deville什么意思_欧米茄手表的deville是什么意思?
  3. SpringSecurity应用(二)
  4. Could not find the main class: org.eclipse.ant.internal.launching.remote.InternalAntRunner. Program
  5. 9_flutter_SimpleDialog(对话框),FloatingActionButton(浮动按钮),Slider(滑动器)
  6. [UWP]创建一个ProgressControl
  7. mui mui.plusReady() 事件中的变量问题;
  8. Parasoft C++test使用教程:执行测试用例(上)
  9. spring REST中的内容协商(同一资源,多种展现:xml,json,html)
  10. Language binding(语言绑定)