即使异常被处理,Xamarin应用程序仍会崩溃。

3
我正在使用以下代码调用API...
public async Task<Dictionary<string, string>> GetDataAsync()
    {
      try
        {
            var url = "https://address.com/myapi";
            var request = new RestRequest(url, Method.GET) { Timeout = 5000 };
            request.AddAuthenticationHeaders();
            var response = await _client.ExecuteTaskAsync(request);
            return ProcessResponse(response);
        }
        catch (Exception e)
        {
            throw new MyApplicationException(e.Message, e.InnerException, AlertCode.UnknownError);
        }
    }

以上代码被以下调用:

public async Task GetData()
    {
        data= await webCaller.GetDataAsync();
    }

这段代码处理了所有的错误并显示了适当的弹窗,但仅在特定的错误发生时应用程序崩溃。
System.Net.WebException: Error: ConnectFailure (Network is unreachable) ---> System.Net.Sockets.SocketException: Network is unreachable

我通过调用API并关闭连接来再现这个错误,因此显然网络将无法访问。

在我的Activity中,我在这里处理异常

protected virtual void OnException_Occured(object sender, RaiseThrowableEventArgs e)
    {
        RunOnUiThread(
                () =>
                {
                    ExceptionPopup.Popup = new CommonPopup(this, ExceptionHelper.GetUserFriendlyMessage(e.Exception));
                    ExceptionPopup.Popup.Show();
                });
        }

        ReportError(e.Exception);

        e.Handled = true;
    }

OnResume:

protected override void OnResume()
    {
        base.OnResume();
        AndroidEnvironment.UnhandledExceptionRaiser += OnException_Occured;
    }

OnPause:

protected override void OnPause()
    {
        base.OnPause();
        AndroidEnvironment.UnhandledExceptionRaiser -= OnException_Occured;
    }

当应用程序崩溃时,日志会是什么样子? - Wosi
@Wosi,请看一下这个:http://pastebin.com/XSPnETsf - goldsmit409
我遇到了完全相同的问题。你找到了解决方案吗? - coalmee
@coalmee 不是一个确切的解决方案,但我开始使用CurrentDomain_UnhandledException这种变通方法。它可以处理一些异常,但仍然会有一些崩溃。 - goldsmit409
1个回答

1
每次调用GetData()时,它是否都会崩溃,还是随机崩溃?
今天我遇到了一个类似的问题,我的异步 API 调用会导致 iOS 应用程序随机崩溃。我不确定我的问题是否与你的相关,但我会解释一下我所做的,以防对你有所帮助。
在我的情况下,问题与连接无关。由于某种原因,API 调用并不总是成功,当它失败时,它将 null 返回给我的变量,这会导致稍后出现“对象没有设置为对象实例”的错误。由于我不能保证每次 API 调用都返回非空值,所以我将 API 调用放在 while 循环中,并检查是否获取了 null。
以下是我的代码示例:
Message[] allMessages;

while(allMessages==null)
{
allMessages = await Message.GetAsync();
}

我按下呼叫按钮的同时关闭了wifi来重现这个错误,我确实遇到了这个错误,但是没有处理它。 - goldsmit409

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接