From 8eac07ad247bca518224cbdb9d1828ede4864b7c Mon Sep 17 00:00:00 2001 From: hadashiA Date: Fri, 1 Sep 2023 10:37:46 +0900 Subject: [PATCH 1/4] Use innerException for Task.AsUniTask --- .../TaskExtensionsTest.cs | 40 +++++++++++++++++++ .../UniTask/Runtime/UniTaskExtensions.cs | 4 +- 2 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 src/UniTask.NetCoreTests/TaskExtensionsTest.cs diff --git a/src/UniTask.NetCoreTests/TaskExtensionsTest.cs b/src/UniTask.NetCoreTests/TaskExtensionsTest.cs new file mode 100644 index 0000000..845a062 --- /dev/null +++ b/src/UniTask.NetCoreTests/TaskExtensionsTest.cs @@ -0,0 +1,40 @@ +using System; +using System.Threading.Tasks; +using Cysharp.Threading.Tasks; +using Xunit; + +namespace NetCoreTests +{ + public class TaskExtensionsTest + { + [Fact] + public async Task PropagateException() + { + await Assert.ThrowsAsync(async () => + { + await ThrowAsync().AsUniTask(); + }); + + await Assert.ThrowsAsync(async () => + { + await ThrowOrValueAsync().AsUniTask(); + }); + + + await Assert.ThrowsAsync(async () => + { + await Task.WhenAll(ThrowAsync(), ThrowAsync(), ThrowAsync()); + }); + } + + async Task ThrowAsync() + { + throw new InvalidOperationException(); + } + + async Task ThrowOrValueAsync() + { + throw new InvalidOperationException(); + } + } +} diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs index d330109..77ce536 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs @@ -28,7 +28,7 @@ namespace Cysharp.Threading.Tasks p.TrySetCanceled(); break; case TaskStatus.Faulted: - p.TrySetException(x.Exception); + p.TrySetException(x.Exception.InnerExceptions.Count == 1 ? x.Exception.InnerException : x.Exception); break; case TaskStatus.RanToCompletion: p.TrySetResult(x.Result); @@ -58,7 +58,7 @@ namespace Cysharp.Threading.Tasks p.TrySetCanceled(); break; case TaskStatus.Faulted: - p.TrySetException(x.Exception); + p.TrySetException(x.Exception.InnerExceptions.Count == 1 ? x.Exception.InnerException : x.Exception); break; case TaskStatus.RanToCompletion: p.TrySetResult(); From 6fb4f2d6d257ae33fcf21fc5d9e8f8af438ebc5f Mon Sep 17 00:00:00 2001 From: hadashiA Date: Fri, 1 Sep 2023 16:58:11 +0900 Subject: [PATCH 2/4] Support exception unwrapping for AsUniTask of Task.WhenAll --- src/UniTask.NetCoreTests/TaskExtensionsTest.cs | 9 ++++++--- .../Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs | 4 ++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/UniTask.NetCoreTests/TaskExtensionsTest.cs b/src/UniTask.NetCoreTests/TaskExtensionsTest.cs index 845a062..62f7666 100644 --- a/src/UniTask.NetCoreTests/TaskExtensionsTest.cs +++ b/src/UniTask.NetCoreTests/TaskExtensionsTest.cs @@ -19,14 +19,17 @@ namespace NetCoreTests { await ThrowOrValueAsync().AsUniTask(); }); - + } + [Fact] + public async Task PropagateWhenAllException() + { await Assert.ThrowsAsync(async () => { - await Task.WhenAll(ThrowAsync(), ThrowAsync(), ThrowAsync()); + await Task.WhenAll(ThrowAsync(), ThrowAsync(), ThrowAsync()).AsUniTask(); }); } - + async Task ThrowAsync() { throw new InvalidOperationException(); diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs index 77ce536..6407be5 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs @@ -28,7 +28,7 @@ namespace Cysharp.Threading.Tasks p.TrySetCanceled(); break; case TaskStatus.Faulted: - p.TrySetException(x.Exception.InnerExceptions.Count == 1 ? x.Exception.InnerException : x.Exception); + p.TrySetException(x.Exception.InnerException); break; case TaskStatus.RanToCompletion: p.TrySetResult(x.Result); @@ -58,7 +58,7 @@ namespace Cysharp.Threading.Tasks p.TrySetCanceled(); break; case TaskStatus.Faulted: - p.TrySetException(x.Exception.InnerExceptions.Count == 1 ? x.Exception.InnerException : x.Exception); + p.TrySetException(x.Exception.InnerException); break; case TaskStatus.RanToCompletion: p.TrySetResult(); From 2d674999f08d2ae41d411160915e0536dac189ce Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 7 Sep 2023 09:11:47 +0900 Subject: [PATCH 3/4] Use InnerException when only be one --- .../Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs index 6407be5..77ce536 100644 --- a/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs +++ b/src/UniTask/Assets/Plugins/UniTask/Runtime/UniTaskExtensions.cs @@ -28,7 +28,7 @@ namespace Cysharp.Threading.Tasks p.TrySetCanceled(); break; case TaskStatus.Faulted: - p.TrySetException(x.Exception.InnerException); + p.TrySetException(x.Exception.InnerExceptions.Count == 1 ? x.Exception.InnerException : x.Exception); break; case TaskStatus.RanToCompletion: p.TrySetResult(x.Result); @@ -58,7 +58,7 @@ namespace Cysharp.Threading.Tasks p.TrySetCanceled(); break; case TaskStatus.Faulted: - p.TrySetException(x.Exception.InnerException); + p.TrySetException(x.Exception.InnerExceptions.Count == 1 ? x.Exception.InnerException : x.Exception); break; case TaskStatus.RanToCompletion: p.TrySetResult(); From bc27f6c0d81d676316d5af666b1f5b4d3e469411 Mon Sep 17 00:00:00 2001 From: hadashiA Date: Thu, 7 Sep 2023 17:43:40 +0900 Subject: [PATCH 4/4] Fix test --- src/UniTask.NetCoreTests/TaskExtensionsTest.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/UniTask.NetCoreTests/TaskExtensionsTest.cs b/src/UniTask.NetCoreTests/TaskExtensionsTest.cs index 62f7666..3926561 100644 --- a/src/UniTask.NetCoreTests/TaskExtensionsTest.cs +++ b/src/UniTask.NetCoreTests/TaskExtensionsTest.cs @@ -20,15 +20,6 @@ namespace NetCoreTests await ThrowOrValueAsync().AsUniTask(); }); } - - [Fact] - public async Task PropagateWhenAllException() - { - await Assert.ThrowsAsync(async () => - { - await Task.WhenAll(ThrowAsync(), ThrowAsync(), ThrowAsync()).AsUniTask(); - }); - } async Task ThrowAsync() {