Как перехватить FacebookApiException при использовании FacebookApp.ApiAsync в WP7? - PullRequest
4 голосов
/ 20 января 2011

В настоящее время я использую Facebook C # SDK v4.2.1 и пытаюсь что-то опубликовать на стене пользователя. Это работало нормально, пока я не получил ошибку FacebookOAuthException (OAuthException) Error validating access token., и я не могу поймать это исключение, и это приводит к сбою моего приложения.

Я использую этот вызов FacebookApp.ApiAsync("/me/feed", ...). Поскольку это происходит асинхронно, я не уверен, куда мне поместить блок try-catch, чтобы перехватить эту ошибку, но безуспешно

Вот что я использую:

    private void shareFBButton_Click(object sender, System.Windows.RoutedEventArgs e)
    {
        // ... code for preparing strings to post ...

        try
        {
            // setup FacebookApp and params ...

            app.ApiAsync("/me/feed", args, HttpMethod.Post, (o) => {
                if (o.Error != null)
                {
                    Debug.WriteLine("ERROR sharing on Facebook: " + o.Error.Message);
                }
                else
                {
                    Debug.WriteLine("FB post success!");
                }
            }, null);
        }
        catch (Exception ex)
        {
            Debug.WriteLine("ERROR sharing on Facebook: " + ex.Message);
        }    
    }

Так может кто-нибудь сказать мне, где я должен поставить свой блок try-catch, чтобы я мог поймать OAuthException?

EDIT:

После дальнейшего изучения FacebookOAuthExcpetion выдается из Facebook C # SDK после того, как SDK перехватывает WebException и FacebookApiException. Для получения дополнительной информации посмотрите на "Павел Сурменок" его ответ. Именно это и происходит.

На данный момент единственным решением для перехвата FacebookApiException (базовый класс всех исключений Facebook SDK) является его перехват в методе App.UnhandledException. Проверьте тип e.ExceptionObject и, если это FacebookApiException, установите e.Handled в true, и приложение больше не будет выходить из себя.

Ответы [ 4 ]

3 голосов
/ 20 января 2011

Я нашел решение для моей проблемы. Может быть, мне следует перефразировать мой вопрос.

"Как перехватить исключение, которое произошло в фоновом потоке?"

Что именно и происходит в моем первоначальном вопросе. Исключением является выброс в SDK Facebook C # в фоновом потоке, поскольку вызовы API выполняются асинхронно.

Может быть, большинство из вас уже знают это, но я не знал, потому что я новичок в разработке WP7.

Решение:

В обработчике событий App.UnhandledException просто установите для флага e.Handled значение true. Тогда приложение не закроется, если вы сами.

    private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
    {
        // catch Facebook API exceptions
        // if handled is set to true, app won't exit
        if (e.ExceptionObject is FacebookApiException) 
        {
            e.Handled = true;
            // notify user of error ...
            return;
        }

        if (System.Diagnostics.Debugger.IsAttached)
        {
            // An unhandled exception has occurred; break into the debugger
            System.Diagnostics.Debugger.Break();
        }            
    }

Не уверен, что это правильный способ отловить исключение API, но пока работает нормально.

2 голосов
/ 21 января 2011

Я воспроизвел эту проблему.Как я вижу, исключение генерируется в методе FacebookApp.ResponseCallback.Он содержит блок try с двумя разделами catch (один для FacebookApiException и один для WebException).В конце каждой секции «catch» исключение перебрасывается и никогда не обрабатывается (поэтому ваше приложение вылетает).Итак, отладчик говорит вам об этом (переброшенном) исключении.Позже в разделе «наконец» они создают FacebookAsyncResult со ссылкой на это исключение в свойстве «Ошибка».Я думаю, что ваше решение (для обработки этого исключения в App.UnhandledException) является наиболее подходящим.Кстати, интересно, почему разработчики SDK решили сбросить исключения в FacebookApp.ResponseCallback.

0 голосов
/ 26 января 2011

Попытка отловить исключение в App.UnhandledException не работает, поскольку она находится в другом потоке.Но вы можете поиграть со свойством «error error» от authResult перед выполнением запроса, и вы избежите выдачи исключения.

private void FacebookLoginBrowser_Navigated(object sender, System.Windows.Navigation.NavigationEventArgs e)
    {
        FacebookAuthenticationResult authResult;
        if (FacebookAuthenticationResult.TryParse(e.Uri, out authResult))
        {
            if (authResult.ErrorReason == "user_denied")
            {
                // do something.
            }
            else
            {
                fbApp.Session = authResult.ToSession();
                loginSucceeded(); 
            }                
        }
0 голосов
/ 20 января 2011

Отладчик обычно хорошо показывает, откуда возникло исключение.В отладчике вы можете изучить подробности исключений и просмотреть вложенные исключения InnerException, чтобы найти основную причину.

При этом, если исключение выдается из вызова app.ApiAsync, то обработчик перехвата, который выуже бы поймали любые исключения.Судя по всему в SDK (я только кратко посмотрел), существуют определенные обстоятельства, когда исключения перехватываются и перенаправляются в обратный вызов в свойстве Error, которое вы также проверяете.

Посмотрев накод SDK, может показаться, что выбрасываемое исключение на самом деле является FacebookOAuthException;это тот случай?Если это так, то похоже, что это исключение никогда не предоставляется обратному вызову, но всегда выдается.

Если вы можете дать более подробную информацию о том, что именно является типом исключения и где оно выброшено / перехвачено, яможет быть в состоянии дать более полезный ответ.

...