尽管等待Task并捕获Exception,但仍未重新注意到异常

时间:2015-10-20 18:55:24

标签: c# .net exception xamarin.ios async-await

我的代码可以捕获服务器调用引发的所有异常,如下所示:

    new public Task SaveAsync()
    {
        return ServerException.Wrap(base.SaveAsync);
    }

ServerException.Wrap的位置如下:

    public static async Task<T> Wrap<T>(Func<Task<T>> func)
    {
        try
        {
            return await func();
        }
        catch (Exception ex)
        {
            // This is an internal error that shouldn't happen.
            throw new ServerException(ex);
        }
    }

    public static async Task Wrap(Func<Task> func)
    {
        await Wrap(async () =>
            {
                await func();
                return true;
            });
    }

然后我有一个调用SaveAsync的函数如下:

        try
        {
            await problem.SaveAsync();
        }
        catch (ServerException ex)
        {
            Logger.LogException("Error saving problem.", ex);
        }

我有一些内部错误会产生一个异常,我会在上面的行中找到它然后按如下方式记录:

  

2015-10-20 11:20:44.502 [第99行]保存问题时出错。 (例外:   Exceptions.ServerException:---&gt; System.ArgumentException:一个项目   已经添加了相同的密钥。在   System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)   [0x00000] in   /Users/builder/data/lanes/1977/2c66d2fe/source/mono/external/referencesource/mscorlib/system/throwhelper.cs:74

但是几秒钟之后,我收到了一条未记录的异常警告:

  

2015-10-20 11:21:16.352警告:未处理的异常:   System.AggregateException:未观察到任务的异常   通过等待任务或访问其Exception属性。如   结果,终结器重新抛出了未观察到的异常   线。 ---&GT; System.ArgumentException:具有相同键的项目   已被添加。在System.ThrowHelper.ThrowArgumentException   (ExceptionResource资源)[0x00000] in   /Users/builder/data/lanes/1977/2c66d2fe/source/mono/external/referencesource/mscorlib/system/throwhelper.cs:74

为什么我会得到第二个未观察到的异常,即使我正在捕捉并处理第一个异常?我的ServerException.Wrap方法似乎抛出了这个异常。

我正在使用MonoTouch。

1 个答案:

答案 0 :(得分:-1)

您需要明确将异常设置为观察到的。

为此,您需要订阅/%listing-category%/%listing-child%/ 的{​​{1}}事件,并将其明确设置为TaskScheduler(在其上调用SetObserved())。

见这里:

UnobservedTaskException being throw...

编辑: 当然,您也可以只捕获UnobservedTaskException,或使用ContinueWith()来观察和恢复任务。

请参阅官方文档的底部:

Exception Handling (MSDN)