【WCF】错误处理(二):错误码―—FaultCode
先来说说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相关推荐
- LoadLibrary下错误返回126错误码排查过程
在开发一些Windows下的应用程序过程中,经常会手动加载一些DLL,使用的就是LoadLibrary这个函数,而这个函数一旦失败,返回的错误码基本都是126,126错误码的意思是找不到指定的模块,这 ...
- 用jquery调用wcf下的各种错误码的解释。
连接出错了,很正常,http请求的xmlhttp异常在i不同的浏览器下是不一样的,下面是ie的报错代码 IE status Error codes: 1223 : Client canceled re ...
- HTTP 错误代码表_HTTP 错误码大全
所有 HTTP 状态代码及其定义. 代码 指示 2xx 成功 200 正常:请求已完成. 201 正常:紧接 POST 命令. 202 正常:已接受用于处理,但处理尚未完成. 203 正常: ...
- 什么是好的错误消息? 讨论一下Java系统中的错误码设计
简介:一个好的Error Message主要包含三个部分:Context: 什么导致了错误?发生错误的时候代码想做什么?The error itself: 到底是什么导致了失败?具体的原因和当时的数据 ...
- 转!!CMPP 网关错误码说明
http://www.163duanxin.com/msg/1753.htm CMPP错误码说明 与中国移动代码的对应关系. MI::zzzz SMSC返回状态报告的状态值为EXPIRED MJ:z ...
- Springboot项目错误码的设计与实现
HTTP状态码和我们平时的错误码不同,状态码太少了,无法满足我们业务中的需求. 然而,所有请求都返回200,然后数据体里包含错误码的方式,又抛弃了HTTP状态码,抛弃了普遍共识. 本来应该遵照HTTP ...
- 海康工业相机SDK错误码常见场景解析
在使用SDK二次开发过程中,接口的调用往往会遇到较多的错误,sdk错误码能够帮助我们快速分析错误原因,解决问题,针对常见的错误码,下面给出一下常见的问题原因,供大家分析 1.MV_OK 0x00000 ...
- 【Linux系统编程】快速查找errno错误码信息
我们都知道,errno整型变量被普遍应用于*NIX C的异常处理中,其记录了最近一次的错误码.通过判断错误码的值,以此执行不同的错误处理,这是C语言典型的异常处理方式.其错误名称,比如EAGAIN.E ...
- NET_DVR_GetErrorMsg 返回最后操作的错误码信息
官网链接 NET_DVR_GetErrorMsg 返回最后操作的错误码信息. char * NET_DVR_GetErrorMsg( LONG * pErrorNo ); 参量 pErrorNo [o ...
最新文章
- 元宇宙该如何发展才不会变为泡沫
- Prolog基本程序
- java切割文件_Java如何将大文件切割成小文件
- Torque2D MIT 实战记录: 塔防进度(3)
- vecm模型怎么写系数_用Stata搞实证之面板模型入门
- Linux下同步网络时间
- matlab 2010 工具箱,Matlab2010下使用FULLBNT工具箱實現簡單的靜態貝葉斯網絡及推理...
- 非对称卷积—Asymmetric Convolutions
- 华为hs8145v5如何改桥接_口译vlog | 跟我一起去华为东莞“欧洲小镇”吧!
- 布局--------动态添加 相对布局
- 青花瓷Charles安装
- 【车牌识别】基于HOG特征提取和GRNN网络的车牌识别算法matlab仿真
- 14.STC15W408AS单片机IIC驱动OLED
- 用计算机怎么计算税率表,个税税率表计算器
- 又发现个新的全网资源搜索神器
- xp系统计算机怎么连接到网络打印机,老司机教你win7如何连接共享xp打印机
- Linux磁盘挂载、扩容、删除
- 详解利用基于gensim的TF-IDF算法实现基于文本相似度的推荐算法
- 【嵌入式】任意波特率的合理计算——高波特率、低误差
- Vue3.0 使用 ref 判断目标 node 区域之外的点击事件(实现下拉框、弹窗关闭功能)
热门文章
- 【操作系统】线程的实现-思维导图
- deville什么意思_欧米茄手表的deville是什么意思?
- SpringSecurity应用(二)
- Could not find the main class: org.eclipse.ant.internal.launching.remote.InternalAntRunner. Program
- 9_flutter_SimpleDialog(对话框),FloatingActionButton(浮动按钮),Slider(滑动器)
- [UWP]创建一个ProgressControl
- mui mui.plusReady() 事件中的变量问题;
- Parasoft C++test使用教程:执行测试用例(上)
- spring REST中的内容协商(同一资源,多种展现:xml,json,html)
- Language binding(语言绑定)