2008-09-07 81 views
1

我有一个执行操作的wcf服务。在这个操作中可能会有错误。我已经说过我的服务合同可能有错。无法处理FaultException

这里是下面的代码;

public void Foo() 
{ 
     try 
     { 
      DoSomething(); // throws FaultException<FooFault> 
     } 
     catch (FaultException) 
     { 
      throw; 
     } 
     catch (Exception ex) 
     { 
      myProject.Exception.Throw<FooFault>(ex); 
     } 
} 

服务合同;

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

当FaultException异常被抛出的DoSomething()方法,而我是运行应用程序,首先异常在“捕捉(异常前)”线断,并在那里抓获。那么当我再次按下f5时,它通常会做到这一点。我想知道为什么这个突破存在?如果不是这可能是发布问题?

回答

0

仔细看看catched异常。是FaultException < FooFault>或FaultException?有2个版本的FaultException类:genericnon-generic

+0

也许你* *应该仔细看看;) [SerializableAttribute] 公共类的FaultException :FaultException异常 VAR fooFault =新的FaultException (); fooFault是FaultException异常; //为真 所以用 赶上(FaultException异常前)catch块 会赶上的FaultException *刚才看到上面的你的意见......这个评论还是误导 – RhysC 2009-12-22 03:08:28

-1

@yapiskan,

C#是一个强类型语言美孚< X> =富!所以如果你需要赶上一些例外,请提供确切键入捕获条款。

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

1

其实你的异常被捕获,但你没有注意到它,因为visual studio突出显示下一行,而不是抛出异常的行。替换

throw; 

与其他一些行,并看到他们的行动。

+0

这是行不通的。因为抛出线不在try块中,所以它必须被父catch块捕获。 – 2008-11-13 13:55:15

-1

问题是异常是按照它们声明的顺序检查的。首先尝试放置Exception catch块,你会发现编译器抱怨:其他catch块永远不会被评估。下面的代码通常是什么.NET是做你的情况:

 // 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-终于在本质上不是递归) 。

试试这个:

 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。

+0

我知道catch块不是递归的,但是如上所述使用catch块会使代码像楼梯一样,我不喜欢它。而且我不在为什么没有发现异常。它被捕获,但在那里存在突破,迫使我推f5按钮继续。 – 2008-11-17 09:51:30

2

您是否正在使用Silverlight的WCF服务?如果是这样,需要一个特殊的配置使服务返回一个HTTP 200代码而不是500,以防出错。细节在这里:http://msdn.microsoft.com/en-us/library/dd470096%28VS.96%29.aspx

+0

这对SL4来说是最新的:http://msdn.microsoft.com/en-us/library/ee844556(VS.95).aspx – 2010-11-16 07:11:47