2

按照DartWatch 博客上关于使用 Google OAuth 库的教程进行操作。问题是如何处理:来自 Google 的“访问被拒绝”错误?

这是我的代码示例:

class Client
{

   GoogleOAuth2 _auth;

   Client()
   {
      _auth = new GoogleOAuth2(
                        '5xxxxxxxxxxxxxx.apps.googleusercontent.com', // Client ID
                        ['openid', 'email', 'profile'],
                        tokenLoaded:oauthReady);
   }

   void doLogin()
   {
       //    _auth.logout();
       //    _auth.token = null;
       try
       {
           _auth.login();
       }
       on AuthException {
           print('Access denied');
       }
       on Exception catch(exp)
       {
           print('Exception $exp occurred');
       }
   }

   void oauthReady(Token token)
   {
      print('Token is: $token');
   }          
}

但我从不catch阻止任何(!)异常。我做错了什么?

我正在使用:
Dart Editor 版本 0.5.0_r21823
Dart SDK 版本 0.5.0.1_r21823

4

1 回答 1

1

你永远不会碰到 catch 块,因为auth.login它是一个返回 Future 的异步操作。

网站上有一篇关于未来错误处理的精彩文章dartlang.org

auth.login 立即返回一个 Future,但它所做的工作是在控制返回事件循环后发生的(有关事件循环的更多信息,请参阅我对另一个问题的回答。)

您的代码应该看起来更像:

/// Returns a Future that completes to whether the login was successful.
Future<boolean> doLogin()
{
    _auth.login()
    .then((_) {
       print("Success!");
       return true;
    }.catchError((e) {
       print('Exception $e occurred.');
       return false; // or throw the exception again.
    }
}
于 2013-04-24T17:30:33.073 回答