2008-09-07 78 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