关于C#:无法处理FaultException

关于C#:无法处理FaultException

Cannot handle FaultException

我有一个执行操作的wcf服务。在此操作中可能会出现故障。我已经说过我的服务合同可能有错。

这是下面的代码;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public void Foo()
{
        try
        {
            DoSomething(); // throws FaultException<FooFault>
        }
        catch (FaultException)
        {
            throw;
        }
        catch (Exception ex)
        {
            myProject.Exception.Throw<FooFault>(ex);
        }
}

服务合同中的

1
2
[FaultException(typeof(FooFault))]
void Foo();

当我在运行应用程序时,DoSomething()方法引发FaultException时,首先在" catch(Exception ex)"行捕获了该异常,并在那里中断了该异常。然后当我再次按f5键时,它通常会执行该操作。我想知道为什么存在这种突破?如果不是,那么发布时可能会出现问题吗?


您是否正在使用Silverlight的WCF服务?如果是这样,则需要进行特殊配置以使服务返回HTTP 200代码(如果出现错误,则返回500)。详细信息在这里:http://msdn.microsoft.com/zh-cn/library/dd470096(VS.96).aspx


实际上,您的异常已捕获,但是您没有注意到它,因为Visual Studio突出显示了下一行,而不是引发异常的行。替换

1
throw;

和其他几行内容,然后查看它们的实际效果。


仔细研究捕获的异常。是FaultException 还是FaultException?有2个版本的FaultException类:通用和非通用


问题在于,按照声明的顺序检查异常。尝试将Exception catch块放在第一位,您会看到编译器抱怨:永远不会评估其他catch块。以下代码通常是.Net在您的情况下所执行的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        // Begin try
             DoSomething(); // throws FaultException<FooFault>
        // End try
        if (exceptionOccured)
        {
            if(exception is FaultException) // FE catch block.
            {
                throw;
                // Goto Exit
            }
            if(exception is Exception) // EX catch block
            {
                throw new FaultException<FooFault>();
                // Goto Exit
            }
        }

        // Exit

如您所见,FaultException永远不会重新输入try-catch-finally(即try-catch-finally本质上不是递归的)。

尝试以下方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
        try
        {
            try
            {
                DoSomething(); // throws FaultException<FooFault>
            }
            catch (Exception ex)
            {
                if (ex is FaultException<FooFault>)
                    throw;
                else
                    myProject.Exception.Throw<FooFault>(ex);
            }
        }
        catch (FaultException)
        {
            throw;
        }

HTH。


@yapiskan,

C#是强类型语言Foo != Foo。因此,如果您需要捕获某些异常,请在catch子句中提供确切的类型。

您可以阅读此MSDN文章,了解有关异常处理的更多信息。


推荐阅读

    linux命令行执行py?

    linux命令行执行py?,系统,环境,官网,一致,文件,程序,脚本,源文件,后台,终端,l

    linux查看执行命令?

    linux查看执行命令?,系统,服务,情况,信息,命令,暂停,标准,概念,实时,第一,lin

    linux中启动服务命令?

    linux中启动服务命令?,服务,系统,命令,信息,工作,设备,网络,标准,名称,密码,l

    linux命令执行不动了?

    linux命令执行不动了?,系统,电脑,数据,管理,信息,密码,命令,环境,地方,分析,l

    linux脚步中执行命令?

    linux脚步中执行命令?,工具,代码,命令,名称,系统,连续,环境,发行,文件,终端,l

    linux执行权限命令行?

    linux执行权限命令行?,地址,电脑,系统,数字,工作,权限,目录,文件,新增,信息,L

    linux服务器保存命令?

    linux服务器保存命令?,时间,状态,档案,电脑,命令,信息,位置,编辑,文件,模式,L

    linux服务器扫盘命令?

    linux服务器扫盘命令?,地址,工作,命令,目录,数据,单位,名称,系统,管理,信息,L

    程序执行linux命令?

    程序执行linux命令?,系统,工作,地址,环境,信息,管理,命令,文件,目录,程序,lin

    linux运维操作命令?

    linux运维操作命令?,系统,网络,基础,标准,工具,信息,工作,命令,软件,数据,lin

    linux命令行常见操作?

    linux命令行常见操作?,系统,工作,地址,管理,信息,命令,目录,一致,基础,标准,l

    linux执行2个命令?

    linux执行2个命令?,工作,系统,基础,命令,基础知识,信息,管理,在线,概念,第一

    linux清空操作命令?

    linux清空操作命令?,系统,数据,命令,名称,不了,文件夹,文件,环境,回收站,目

    linux命令批量执行?

    linux命令批量执行?,系统,代码,工作,周期性,数据,定期,环境,命令,文件,脚本,l

    linux二进制执行命令?

    linux二进制执行命令?,系统,工作,情况,代码,信息,位置,地址,命令,文件,目录,L

    linux执行退出命令?

    linux执行退出命令?,档案,状态,工作,命令,信息,地址,电脑,系统,编辑,文件,lin

    linux安装操作命令?

    linux安装操作命令?,系统,工作,地址,工具,服务,情况,信息,命令,最新,管理,lin

    linux服务器搭建命令?

    linux服务器搭建命令?,系统,服务,软件,地址,平台,在线,密码,工具,环境,百度,l

    linux中后台执行命令?

    linux中后台执行命令?,系统,状态,暂停,灵活,电脑,网络,服务,第一,名字,命令,l

    服务器重启命令linux?

    服务器重启命令linux?,工作,标准,设备,服务,系统,名称,命令,百度,网络,密码,