4

현재 Facebook C# SDK v4.2.1을 사용 중이며 사용자 벽에 무언가를 올리려고합니다. FacebookOAuthException(OAuthException) Error validating access token. 오류가 발생하고 그 예외를 잡을 수 없어 내 응용 프로그램이 중단 될 때까지 정상적으로 작동했습니다.WP7에서 FacebookApp.ApiAsync를 사용할 때 FacebookApiExceptions를 잡는 방법은 무엇입니까?

이 전화는 FacebookApp.ApiAsync("/me/feed", ...)입니다. 이 비동기를 발생하기 때문에 나는 그 오류를 잡으려고 내 시도-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을 잡을 수 있습니까?

편집 : SDK는 WebException이와 FacebookApiException을 잡는다 후

은 추가 조사 후, FacebookOAuthExcpetion가 페이스 북 C#을 SDK에서 발생합니다. 더 자세한 정보는 "Pavel Surmenok"그의 대답을보십시오. 바로 그 일이 일어나고 있습니다.

현재로서는 FacebookApiException (모든 Facebook SDK 예외의 기본 클래스)을 잡는 유일한 해결책은 App.UnhandledException 메서드에서이를 잡는 것입니다. e.ExceptionObject의 유형을 확인하고 FacebookApiException 집합 인 경우 e.Handled를 true로 설정하면 앱이 더 이상 종료되지 않습니다.

+0

현재 'OAuthException'이라고 판단하는 방법은 무엇입니까? 이 오류가 발생하면 무엇을 할 계획입니까? –

+0

디버거가 FacebookOAuthException을 말하고'o.Error.Message'에서 '(OAuthException) 액세스 토큰의 유효성 검사 오류가 발생합니다.' – Buju

+0

그리고 디버거는 어디에서 고장 났습니까? 왜 깨진 곳을 그냥 감싸지 않을거야? –

답변

2

이 문제가 재현되었습니다. 알 수 있듯이 FacebookApp.ResponseCallback 메서드에서 예외가 생성됩니다. 여기에는 두 개의 "catch"섹션 (하나는 FacebookApiException 용이고 다른 하나는 WebException 용)이있는 "try"블록이 들어 있습니다. 각 "catch"섹션의 끝에서 예외가 다시 발생되고 처리되지 않습니다 (이것이 앱이 충돌하는 이유입니다). 그래서, 디버거는 당신에게이 (재 처리 된) 예외에 대해 말합니다. 나중에 "finally"섹션에서 "Error"속성에서이 예외를 참조하여 FacebookAsyncResult를 만듭니다. 귀하의 솔루션 (App.UnhandledException 에이 예외를 처리하기 위해) 가장 적합한 것 같아요. 그런데 재미있는 이유는 SDK 개발자가 FacebookApp.ResponseCallback에서 예외를 되돌리기로 결정한 이유입니다.

+0

예, 정확히 무슨 일이 일어 났습니까. 또한 SDK 개발자가 왜 캐치 예외를 재현하기로 결정했는지 알고 싶습니다. 거기에 대한 좋은 설명이 있습니까? – Buju

+1

소스 코드에 액세스 할 수 있다고 가정 할 때 개인적으로 선호하는 점은 예외 정보가 'FacebookAsyncResult'에 제공되므로 예외를 다시 발생시키지 않도록 SDK를 변경하는 것입니다. IMHO, 응용 프로그램 수준의 처리되지 않은 예외 처리기에서 처리하는 것보다 훨씬 나은 솔루션입니다. –

+0

네, 그렇게 생각했습니다. 그러나 SDK의 개발 팀이 그 작업을 수행하기를 기다릴 것이므로 SDK의 새 업데이트가 나 자신의 변경 사항을 다시 병합하기 위해 나왔을 때 시간을 낭비하지 않을 것입니다. – Buju

0

일반적으로 디버거는 예외가 발생한 위치를 나타내는 훌륭한 작업을 수행합니다. 디버거에서 예외 세부 정보를 검토하고 네스트 스티드 InnerExceptions를 확인하여 근본 원인을 찾을 수 있습니다.

그렇다면 app.ApiAsync 호출에서 예외가 발생하면 이미 가지고있는 catch 처리기가 예외를 catch합니다. SDK에서 보이는 것 (간단히 살펴 봤음)에 따라 예외가 catch되어 사용자가 확인중인 Error 속성의 콜백으로 전달되는 특정 상황이 있습니다.

SDK 코드를 살펴보면 예외가 Throw되는 것은 실제로 FacebookOAuthException입니다. 그럴까요? 이 경우,이 예외는 콜백에 절대로 제공되지 않지만 항상 throw됩니다.

예외 유형이 무엇이고 어디에서 던져 지거나 잡히는 지에 대한 자세한 정보를 제공 할 수 있다면 더 유용한 대답을 줄 수 있습니다.

+0

소스 코드를 다운로드하고 프로젝트에 추가하여 예외가 정확히 어디에서 발생하는지 확인합니다. FacebookApp.cs : Line 883. FacebookApiException을 던집니다. – Buju

+0

그렇다면 FacebookOAuthException이 아닙니까? 던져진 예외 (메시지 및 오류 유형)의 세부 사항은 무엇입니까? 기존 catch 핸들러가이 예외를 처리합니까? –

+0

FacebookApiException은 FacebookOAuthException의 기본 클래스입니다. – Buju

3

내 문제에 대한 해결책을 찾았습니다. 어쩌면 나는 내 질문을 다시 말해야한다.

"백그라운드 스레드에서 발생한 예외를 잡는 방법?"

정확하게 원래의 질문에서 어떤 일이 일어나고 있는지. API 호출이 비동기 적으로 실행되기 때문에 배경 스레드의 Facebook C# SDK에 예외가 발생합니다.

어쩌면 여러분 대부분은 이미 이것을 알고있을 것입니다. 그러나 저는 WP7 개발에 익숙하지 않았기 때문에 그렇지 않았습니다.

솔루션 :

App.UnhandledException 이벤트 핸들러에서

, 단지 true로 e.Handled 플래그를 설정합니다. 그러면 앱이 종료되지 않습니다.

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 예외를 잡는 올바른 방법이지만 현재는 잘 작동하는지 확실하지 않습니다.

+0

원래 묻는 질문에 실제 질문이 반영되지 않은 경우 원래 질문으로 확장되는 대답을 추가하는 대신 편집하십시오. –

+0

OAuth가 실패한 경우 사용자가 처리되지 않은 예외를 처리하고 수행하는 대신 다른 자격 증명을 제공하도록 처리 할 필요가 없습니까? –

+0

@Derek : 맞습니다. 하지만 그렇게하기 위해서는 먼저 던진 예외를 잡아야합니다. 현재 'Application_UnhandledException'이 예외를 잡을 수있는 유일한 곳입니다. – Buju

0

App.UnhandledException에서 예외를 catch하는 것이 다른 스레드에서와 같이 작동하지 않습니다. 그러나 쿼리를하기 전에 authResult의 'error reason'속성으로 재생할 수 있으므로 예외가 발생하지 않도록 할 수 있습니다.

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

처리되지 않는 예외로 인해 여전히 예외가 발생하고 catch되지 않음 -> app이 작동하지 않으므로 작동하지 않습니다. 그리고 그것은 App.UnhandledException에서 잡기 위해 꽤 잘 작동합니다. – Buju

관련 문제