尽管等待任务并捕获异常,但未观察到的异常被重新抛出

本文关键字:观察 异常 新抛出 等待 任务 捕获异常 | 更新日期: 2023-09-27 18:18:37

我的代码捕获了由服务器调用抛出的所有异常,如下所示:

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

ServerException的地方。换行看起来像:

    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 [Line 99]保存错误。(例外:例外。ServerException:——> System。ArgumentException:一个项已经添加了相同的键。在System.ThrowHelper.ThrowArgumentException(例外资源)[0 x00000]/用户/建筑/数据/道/1977/2c66d2fe/源/mono/外部/referencesource/mscorlib/系统/throwhelper.cs: 74

然而,几秒钟后,我得到一个未处理的异常警告,并被记录下来:

2015-10-20 11:21:16.352警告:未处理异常:系统。AggregateException:未观察到任务的异常要么等待任务,要么访问它的Exception属性。作为结果,未观察到的异常被终结器重新抛出线程。——>系统。ArgumentException:具有相同键的项有已经添加。在System.ThrowHelper.ThrowArgumentException(ExceptionResource resource) [0x00000] in/用户/建筑/数据/道/1977/2c66d2fe/源/mono/外部/referencesource/mscorlib/系统/throwhelper.cs: 74

为什么我得到第二个未观察到的异常,即使我捕获并处理了第一个异常?这个异常似乎是由我的ServerException抛出的。包装方法。

我用的是MonoTouch

尽管等待任务并捕获异常,但未观察到的异常被重新抛出

您需要显式地将异常设置为观察。

为此,您需要订阅TaskSchedulerUnobservedTaskException事件,并将其显式设置为observed(在其上调用setobserve()))。

看到:

observedtaskexception被抛出…

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

见官方文档底部:

MSDN异常处理