2013-04-30 88 views
0

下面的代碼將圖像張貼到Facebook頁面。然而,當它失敗時(無論出於何種原因),它不會拋出任何異常,所以我找不到任何失敗的根本原因(只有我提供的一個通用信息(「失敗發佈」))。如何更改下面的代碼顯示實際的錯誤?代碼應該拋出一個例外,但它不會

這是使用Facebook C#SDK

FacebookClient fbClient = new FacebookClient(accessToken); 
fbClient.PostTaskAsync(path, post) 
    .ContinueWith(task => 
    { 
     if (!task.IsFaulted) 
     { 
      if (((IDictionary<string, object>)post).ContainsKey("scheduled_publish_time")) 
      { 
       DateTime dateTime = Utilities.ConvertUnixTimeStampToDateTime(Double.Parse((((dynamic)post).scheduled_publish_time)), true); 
       OnFacebookPostSuccess("Successfully posted: (" + 
           dateTime + ") " + postText); 
      } 
      else 
      { 
       OnFacebookPostSuccess("Successfully posted: (" + 
           DateTime.Now + ") " + postText); 
      } 
     } 
     else 
     { 
      OnFacebookPostFailed("Failed to post " + filename); 
     } 
    }); 

回答

2

如果它的寫作「無法發佈」那麼你知道該任務已出現故障,所以您可以找出不同之處Task.Exception屬性請注意,這會給你一個AggregateException,因爲可能有多件事情出錯了(這可能不適用於你的情況,但通常可以處理任務。)

如果您可以改用C#5,那麼您可以使用await,這使得這一切變得更加容易 - 當任務發生故障時,異常最終會在await表達式的位置拋出。

如果您不能使用C#5,你可能要使用的指定任務延續選項的ContinueWith重載:您可以附加一個延續只爲成功的情況下,和一個剛剛失敗的情況下延續。你不需要,但是如果你的失敗處理總是一樣的話,它可以使事情變得更簡單。

+0

非常好,我不知道Task中有一個Exception屬性。是否有可能將AggregateException分成多個異常並確定錯誤源自哪裏?順便說一下,剛開始閱讀你的書,血腥的驚人的東西! (我覺得明星被擊中) – 2013-04-30 06:12:58

+1

@MarkGladstone:絕對 - 看看['AggregateException.InnerExceptions'](http://msdn.microsoft.com/en-GB/library/system.aggregateexception.innerexceptions.aspx)。 (這很有可能只會在,請介意你。) – 2013-04-30 06:14:34

+1

完美,無法要求更好的答案,謝謝喬恩! – 2013-04-30 06:21:39

相關問題