【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 <= )
{
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(-);
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的更多相关文章
- PHP常见错误级别及错误码
数字 常量 说明 1 E_ERROR 致命错误,脚本执行中断,就是脚本中有不可识别的东西出现 举例: Error:Invalid parameters. Invalid parameter name ...
- CMPP错误码说明
与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zzzzSMSC返回状态报告的状态值为DELETEDMK:zzzzSMSC返回状态报告的状态值为UNDEL ...
- 转!!CMPP 网关错误码说明
http://www.163duanxin.com/msg/1753.htm CMPP错误码说明 与中国移动代码的对应关系. MI::zzzzSMSC返回状态报告的状态值为EXPIREDMJ:zz ...
- 黄聪:微信支付错误两个问题的解决:curl出错,错误码:60
如下是运行微信支付测试代码时出错代码: Warning: curl_setopt() expects parameter 2 to be long, string given in D:\wwwroo ...
- 微信支付错误两个问题的解决:curl出错,错误码:60
如下是运行微信支付测试代码时出错代码: Warning: curl_setopt() expects parameter 2 to be long, string given in D:\wwwroo ...
- 百度地图的demo提示key验证错误!错误码:230;
在已经有BaiduMap的APIKey后使用AndroidStudio导入Baidu地图的as版的demo,提示key验证错误!错误码:230; 首先,因为百度地图demo中用自己的keystore文 ...
- Spring Boot 如何自定义返回错误码错误信息
说明 在实际的开发过程中,很多时候要定义符合自己业务的错误码和错误信息,而不是统一的而不是统一的下面这种格式返回到调用端 INTERNAL_SERVER_ERROR(500, "Intern ...
- iOS真机测试友盟碰到错误linker command failed with exit code 1 (use -v to see invocation) 百度地图的检索失败 sqlite 错误码
因为友盟不支持bitcode 在模拟器上运行正常,但是在模拟器上就会报错,这是因为xocde7之后增加了一个bitcode,bitcode是被编译程序的一种中间形式的代 码.包含bitcode配置的程 ...
- Java异常封装(自己定义错误码和描述,附源码)
真正工作了才发现,Java里面的异常在真正工作中使用还是十分普遍的.什么时候该抛出什么异常,这个是必须知道的. 当然真正工作里面主动抛出的异常都是经过分装过的,自己可以定义错误码和异常描述. 下面小宝 ...
随机推荐
- PrefixSpan算法原理总结
前面我们讲到频繁项集挖掘的关联算法Apriori和FP Tree.这两个算法都是挖掘频繁项集的.而今天我们要介绍的PrefixSpan算法也是关联算法,但是它是挖掘频繁序列模式的,因此要解决的问题目标 ...
- Backdoor CTF 2013: 电子取证 250
0x00 题目 h4x0r厌烦了你对他的城堡的所有攻击,所以他决定报复攻击你,他给你发来一封带有图片的邮件作为警告,希望你能找出他的警告消息:-) 消息的MD5值就是flag. 0x01 解题法1 给 ...
- BZOJ 1497: [NOI2006]最大获利(最大权闭合子图)
1497: [NOI2006]最大获利 Time Limit: 5 Sec Memory Limit: 64 MB Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机 ...
- Linux系统(三)系统基础扫盲大全
序言 如果大家都爱装逼,一般会偏爱使用安装最小化的liunx系统,那么你的系统就不带图形化的桌面功能,这样对于一个想装B的初学者来说,Liunx就是黑漆马虎,一望无际的黑屏,黑屏,如何快速的对liun ...
- uml系列(七)——交互图
交互图是uml中描述系统中的对象如何进行交互动作的 . 废话不多说,还是来张图: 概念 交互图,主要描述的是系统中的一组对象的消息的传递的,为对象间的交互定义了一个可视的表示方法. ...
- java 非缓冲与缓冲数据写入比较
//非缓冲计时package com.swust; import java.io.*; /* *功能:创建一个程序,写10000个随机双精度的数到一个文件中,同时测试运用缓冲和非缓冲技术 * 进行这种 ...
- java-6数组
一. 请编写一个程序将一个整数转换为汉字读法字符串.比如"1123"转换为"一千一百二十三".更进一步,能否将数字表示的金额改为"汉字表达?比如将&q ...
- JAVA设计模式:代理模式&& 装饰模式区别
在前面学习了代理模式和装饰模式后,发现对两者之间有时候会混淆,因此对两者进行了区别和理解: 装饰模式你可以这样理解,就像糖一样,卖的时候商家大多要在外面包一层糖纸,其实原本还是糖. public in ...
- 基于nginx+lua+redis高性能api应用实践
基于nginx+lua+redis高性能api应用实践 前言 比较传统的服务端程序(PHP.FAST CGI等),大多都是通过每产生一个请求,都会有一个进程与之相对应,请求处理完毕后相关进程自动释放. ...
- c#模拟js escape方法(转)
实现URI字符串转化成escape格式的字符 public static string Escape(string s) { StringBuilder sb ...