【问题标题】:Xamarin Studio community treats handled exception as unhandled exceptionXamarin Studio 社区将已处理的异常视为未处理的异常
【发布时间】:2017-06-13 08:23:06
【问题描述】:

我遇到了这个问题,我的 Xamarin Android 应用程序出现未处理的异常崩溃。我正在尝试使用用户会话令牌将用户登录到parse.com。这些语句放在 try-catch 块中以捕获异常。但是 catch 块无法从 parse.com 和应用程序崩溃中捕获“无效会话令牌”错误。如果我手动篡改 sessionToken,Catch 块可以正常工作。

这就是我正在做的事情

try {
   await ParseUser.BecomeAsync(sessionToken);
   ...
} catch (Exception e){
//log exception
}

当出现无效会话令牌错误时,上面的代码会崩溃并显示“未处理的异常......”,即使它被放在了 try 块中。

以下代码有效。 (手动篡改令牌)

try {
   await ParseUser.BecomeAsync(sessionToken + "test");
   ...
} catch (Exception e){
//log exception
}

Xamarin Component store解析组件

我错过了什么?

此外,相同的代码也适用于 Xamarin.iOS。

编辑添加 StackTrace

  at Parse.Internal.ParseCommandRunner+<>c__DisplayClass2.<RunCommandAsync>b__1 (System.Threading.Tasks.Task`1[TResult] t) [0x000eb] in <5d1c0c2b96a7483d85e5c63b3e156125>:0 
  at Parse.Internal.InternalExtensions+<>c__DisplayClass1`2[TIn,TResult].<OnSuccess>b__0 (System.Threading.Tasks.Task t) [0x00000] in <5d1c0c2b96a7483d85e5c63b3e156125>:0 
  at Parse.Internal.InternalExtensions+<>c__DisplayClass7`1[TResult].<OnSuccess>b__6 (System.Threading.Tasks.Task t) [0x0006f] in <5d1c0c2b96a7483d85e5c63b3e156125>:0 
  at System.Threading.Tasks.ContinuationResultTaskFromTask`1[TResult].InnerInvoke () [0x00024] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at System.Threading.Tasks.Task.Execute () [0x00010] in <3fd174ff54b146228c505f23cf75ce71>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at Parse.Internal.InternalExtensions+<>c__DisplayClass7`1[TResult].<OnSuccess>b__6 (System.Threading.Tasks.Task t) [0x00033] in <5d1c0c2b96a7483d85e5c63b3e156125>:0 
  at System.Threading.Tasks.ContinuationResultTaskFromTask`1[TResult].InnerInvoke () [0x00024] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at System.Threading.Tasks.Task.Execute () [0x00010] in <3fd174ff54b146228c505f23cf75ce71>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at Parse.Internal.InternalExtensions+<>c__DisplayClass7`1[TResult].<OnSuccess>b__6 (System.Threading.Tasks.Task t) [0x00033] in <5d1c0c2b96a7483d85e5c63b3e156125>:0 
  at System.Threading.Tasks.ContinuationResultTaskFromTask`1[TResult].InnerInvoke () [0x00024] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at System.Threading.Tasks.Task.Execute () [0x00010] in <3fd174ff54b146228c505f23cf75ce71>:0 
--- End of stack trace from previous location where exception was thrown ---
  at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () [0x0000c] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task task) [0x0003e] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (System.Threading.Tasks.Task task) [0x00028] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (System.Threading.Tasks.Task task) [0x00008] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at System.Runtime.CompilerServices.TaskAwaiter`1[TResult].GetResult () [0x00000] in <3fd174ff54b146228c505f23cf75ce71>:0 
  at Hyphen_App.Droid.SplashActivity+<setCurrentUser>d__4.MoveNext () [0x00035] in /Chethan Shetty/GIT/android-parent/Hyphen_App.Droid/Splash/SplashActivity.cs:112

编辑 1 将 setCurrentUser 更改为跟随后,我能够捕捉到异常,但在 3-4 秒后应用程序自行崩溃并给出“System.AggregateException”

 void setCurrentUser(string sessionToken,Action<bool> callback){
       try {
             ParseUser.BecomeAsync(sessionToken).Wait();
             callback(true);
       }catch(AggregateException e){
             e.Handle( x => { return true; });
             callback(false);
       }

【问题讨论】:

  • 您确定省略的代码不相关吗?你能包括异常的堆栈跟踪吗?
  • @woelliJ 添加了堆栈跟踪。
  • 你怎么称呼你的方法setCurrentUser
  • 从 SplashActivity.cs 的 onCreate() 调用
  • 你在等吗?当你不等待任务时,有时它不会被正确调用

标签: xamarin parse-platform xamarin.ios xamarin.android xamarin-studio


【解决方案1】:

就像你在 cmets 中所说的那样,你在 OnCreate 中调用了 async 方法,而没有 awaiting 它。

如果异步堆栈中的某处未等待任务,则可能导致无法捕获异常。

希望它能帮助您解决问题。


更新

很抱歉没有清楚地表达我的意思。您的代码必须如下所示:

    protected override async void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        await this.SetCurrentUser();
    }

    private async Task<bool> SetCurrentUser(string sessionToken)
    {
        try {
            await ParseUser.BecomeAsync(sessionToken);
        } catch (Exception e) {
            return false;
        }
    }

使用await 关键字是我说“等待”时所指的。

使用 C# 中的 async / await 关键字,回调很少在异步场景中使用。在microsoft docs有一个简短的介绍

【讨论】:

  • 能够捕获异常,但 3-4 秒后我收到此 (ibb.co/g1FByQ) 错误并且应用程序崩溃。!
  • 你能用那个异常的堆栈跟踪更新你的问题吗?在该屏幕截图中看不到太多内容
  • (顺便说一句。我建议你最终切换到 VS 社区,因为 Xamarin Studio 不再处于积极开发阶段)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-17
  • 1970-01-01
  • 2019-08-24
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
相关资源
最近更新 更多