From 6c8c602981a3c2ab2ac122116f4551e50b429a9c Mon Sep 17 00:00:00 2001 From: Tanay Parikh Date: Thu, 17 Mar 2022 14:32:32 -0700 Subject: [PATCH] Update MAUI Exception Handling --- src/Components/README.md | 1 + src/Components/WebView/WebView/src/IpcSender.cs | 5 +++++ .../WebView/WebView/src/Services/WebViewRenderer.cs | 4 ---- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/Components/README.md b/src/Components/README.md index 2ecd7683757a..913ae5e9ff0f 100644 --- a/src/Components/README.md +++ b/src/Components/README.md @@ -26,6 +26,7 @@ The following contains a description of each sub-directory in the `Components` d - `Server`: Contains the implementation for WASM-specific extension methods and the launch logic for the debugging proxy - `WebAssembly`: Contains WebAssembly-specific implementations of the renderer, HostBuilder, etc. - `WebAssembly.Authentication`: Contains the WASM-specific implementations +- `WebView`: Contains the source files to support [Blazor Hybrid](https://github.com/dotnet/maui/tree/main/src/BlazorWebView) within [`dotnet/maui`](https://github.com/dotnet/maui). Changes in this project can be tested with `dotnet/maui` following [this guide](https://github.com/dotnet/maui/wiki/Blazor-Desktop#aspnet-core). ## Development Setup diff --git a/src/Components/WebView/WebView/src/IpcSender.cs b/src/Components/WebView/WebView/src/IpcSender.cs index a0ba3d5b6792..a0ddd9fba0d8 100644 --- a/src/Components/WebView/WebView/src/IpcSender.cs +++ b/src/Components/WebView/WebView/src/IpcSender.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics.CodeAnalysis; +using System.Runtime.ExceptionServices; using System.Threading.Tasks; using Microsoft.AspNetCore.Components.RenderTree; using Microsoft.JSInterop; @@ -62,8 +63,12 @@ public void SendByteArray(int id, byte[] data) public void NotifyUnhandledException(Exception exception) { + // Send the serialized exception to the WebView for display var message = IpcCommon.Serialize(IpcCommon.OutgoingMessageType.NotifyUnhandledException, exception.Message, exception.StackTrace); _dispatcher.InvokeAsync(() => _messageDispatcher(message)); + + // Also rethrow so the AppDomain's UnhandledException handler gets notified + _dispatcher.InvokeAsync(() => ExceptionDispatchInfo.Capture(exception).Throw()); } private void DispatchMessageWithErrorHandling(string message) diff --git a/src/Components/WebView/WebView/src/Services/WebViewRenderer.cs b/src/Components/WebView/WebView/src/Services/WebViewRenderer.cs index b928d82afac8..20f3c4857986 100644 --- a/src/Components/WebView/WebView/src/Services/WebViewRenderer.cs +++ b/src/Components/WebView/WebView/src/Services/WebViewRenderer.cs @@ -1,7 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System.Runtime.ExceptionServices; using System.Text.Json; using Microsoft.AspNetCore.Components.RenderTree; using Microsoft.AspNetCore.Components.Web; @@ -38,9 +37,6 @@ protected override void HandleException(Exception exception) { // Notify the JS code so it can show the in-app UI _ipcSender.NotifyUnhandledException(exception); - - // Also rethrow so the AppDomain's UnhandledException handler gets notified - ExceptionDispatchInfo.Capture(exception).Throw(); } protected override Task UpdateDisplayAsync(in RenderBatch renderBatch)