【C#】浅谈如何抛出和捕获干净的WebService异常

说明:【干净】指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message就是WS方法中抛出的异常消息,不含任何“杂质”。

前提:你对WS有编写权。就是说如果你调的是别人写的WS,那么也许只能通过字符串处理的方式才能得到干净的ex.Message。

先看示例:

- WS方法:

/// <summary>
/// 测试WS抛异常
/// </summary>
/// <param name="isSoapEx">为true就抛出SoapException,否则抛出Exception</param>
/// <param name="errMsg">自定义异常消息</param>
[WebMethod]
public string Test(bool isSoapEx, string errMsg)
{
    throw isSoapEx
        ? new SoapException(errMsg, SoapException.ServerFaultCode)
        : new Exception(errMsg);
}

- 客户端调用:

可以看到,如果WS抛出的是Exception,客户端得到的ex.Message就是含有“杂质”的,所以得到干净异常消息的要诀之一就是:

WS要抛出SoapException异常。

这就是为什么说你要有对WS的编写权,因为别人的WS如果抛的不是SoapException,你就会得到先天含有杂质的ex.Message,需要经过一定加工才行。

刚刚说的是要诀之一,那就是说即便WS抛的是SoapException,也有可能得到不干净的ex.Message,如图:

这是由ASP.NET程序的【自定义错误消息】设定为“Off”引起的,把WS的web.config中的configuration\system.web\customErrors节点的mode属性设为“On”或“RemoteOnly”即可。如图:

所以,总结一下,以我目前所知,要想在客户端得到干净的ex.Message,要诀有二:

1、WS要把异常封装为SoapException再抛出

2、WS的【自定义错误消息】不能设为Off

-文毕-

时间: 2024-08-28 01:42:58

【C#】浅谈如何抛出和捕获干净的WebService异常的相关文章

添加引用方式抛出和捕获干净的WebService异常

转载:http://www.cnblogs.com/ahdung/p/3953431.html 说明:[干净]指的是客户端在捕获WebService(下称WS)抛出的异常时,得到的ex.Message就是WS方法中抛出的异常消息,不含任何“杂质”. 前提:你对WS有编写权.就是说如果你调的是别人写的WS,那么也许只能通过字符串处理的方式才能得到干净的ex.Message. 先看示例: - WS方法: /// <summary> /// 测试WS抛异常 /// </summary>

异常抛出与捕获的思考

异常处理的思考 在java中异常分为两类.一.检查性异常.二.非检查性异常(运行时异常) 二者的区别:检查性异常需要显式try-catch或者throw.运行时异常可以不用捕获. 对于检查性异常由于必须捕获,所有并不需要太多的讨论(在设计异常的时候需要考虑).主要讨论运行时异常的抛出与捕获. 运行时异常的正确捕获和抛出,能够让系统代码更加简洁与rd只需要关系正常业务,对于不正常业务则交由异常处理. 现在存在的困扰: 1.每调用一个其他方法,都需要考虑与分析这个方法是不是存在异常,影响正常业务流程

异常的抛出和捕获

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title>异常的抛出和捕获</title> <script type="text/javascript"> //快捷键F12,或者找到开发者工具 查看问题 //只要出现异常(比如拼写错误),没有处理,脚本就中断执行 //出错后面的就执行

实验九 异常的抛出、捕获并处理

一. 实验代码如下: public class 图形 { public static void main(String[] args) {    point p1=new point(0,0);  point p2=new point(1,0);  point p3=new point(0,1);  rectangle r=new rectangle(p1,5,6);  triangle t=new triangle(p1,p2,p3);  point[] point= {p1,p2};  ne

第六十一条:抛出与抽象相对应的异常

想想这样一种情况:方法B抛出了一个受检的异常 ,那么方法A在内部调用方法B时,面对方法B抛出的受检异常,可以选择继续抛出向上传播这个异常, 也可以捕获这个异常进行处理.究竟是向上传播抛出,还是捕获处理呢??? 有一个指导原则是:抛出与抽象想对应的异常. 例如如果方法B抛出了NoSuchElementException这个受检异常,然而在方法A中调用方法B时,根据方法A中的逻辑,当遇到NoSuchElementException 异常时,抛出一个IndexsOutOfBoundsException

override(重写,覆盖) 1、方法名、参数、返回值相同。 2、子类方法不能缩小父类方法的访问权限。 3、子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)。 4、存在于父类和子类之间。 5、方法被定义为final不能被重写。 overload(重载,过载) 1、参数类型、个数、顺序至少有一个不相同。 2、不能重载只有返回值不同的方法名。 3、存在于父类和子

override(重写,覆盖) 1.方法名.参数.返回值相同. 2.子类方法不能缩小父类方法的访问权限. 3.子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常). 4.存在于父类和子类之间. 5.方法被定义为final不能被重写. overload(重载,过载) 1.参数类型.个数.顺序至少有一个不相同.   2.不能重载只有返回值不同的方法名. 3.存在于父类和子类.同类中. 方法的重写(Overriding)和重载(Overloading)是Java多态性的不同表现. 重写(O

adb4robotium跨进程框架抛出InputStream cannot be null的异常的解决方案

转自:http://blog.csdn.net/qingchunjun/article/details/43448371 之前我写的关于利用adb框架来进行robotium跨进程操作的文章中,有些朋友使用真机进行测试时,遇到一个比较奇怪的问题,会抛出"InputStream cannot be null"的异常.经过检查发现是由于代码中要生成的uidump.xml文件并没有在目标文件夹中生成,导致后面在使用File对象处理时,直接抛异常了. 这个问题其实比较怪异,经分析问题原因是跟ad

java中异常处理机制 throw抛出自定义业务逻辑异常 throws继续抛出 catch捕获后会自动继续抛向调用方法

package com.swift; public class Exception_TestC { public static void main(String[] args) { /* * 第5题: 有一个类为ClassA,有一个类为ClassB,在ClassB中有一个方法b,此方法抛出异常,在ClassA类中有一个 * 方法a,请在这个方法中调用b,然后抛出异常.在客户端有一个类为TestC,有一个方法为c ,请在这个方法中捕 捉异常的信息.Java异常的处理机制 * * 如果try或cat

实验九:异常的抛出、捕获并处理

(1)测试Point类中参数异常 point1中参数是负数,故参数报错 (2)测试Rectangle类中参数异常 矩形的高为负数,故参数报错 (3)测试Triangle类中参数异常 由于三个点斜率都一样,故在一条直线上,参数报错 (4)测试Polygon类中参数异常 由于只传入了两个点的参数,无法构成多边形,故参数报错 源代码如下: 1 package error; 2 3 public class Throwerror { 4 public static void main(String[]