2013-04-30 89 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

相关问题