dotnet/maui · error · InvalidOperationException

This is a test exception thrown from C# code!

Error message

This is a test exception thrown from C# code!

What it means

This is an intentional demo exception inside a HybridWebView sample's proxy/raw method dispatcher. The ThrowException() method is a showcase of how unhandled C# exceptions surface back to JavaScript when called through HybridWebView's JS-to-C# bridge. It is not a production error — it is deliberately thrown to demonstrate error propagation.

Source

Thrown at src/Controls/samples/Controls.Sample/Pages/Controls/HybridWebViewPage.xaml.cs:207

				return "Hello from C#!";
			}

			public async Task<SyncReturn> DoAsyncWorkParamsReturn(int i, string s)
			{
				await Task.Delay(1000);
				Debug.WriteLine($"DoAsyncWorkParamsReturn: {i}, {s}");
				return new SyncReturn
				{
					Message = "Hello from C#! " + s,
					Value = i,
				};
			}

			// Demo method that throws an exception to showcase error handling
			public void ThrowException()
			{
				Debug.WriteLine("ThrowException called - about to throw");
				throw new InvalidOperationException("This is a test exception thrown from C# code!");
			}

			// Demo async method that throws an exception
			public async Task<string> ThrowExceptionAsync()
			{
				Debug.WriteLine("ThrowExceptionAsync called - about to throw");
				await Task.Delay(100);
				throw new ArgumentException("This is an async test exception thrown from C# code!");
			}
		}

		public class SyncReturn
		{
			public string? Message { get; set; }
			public int Value { get; set; }
		}
	}
}

View on GitHub (pinned to f377ff1c5e)

Solutions

  1. If you are in the sample, this is expected — use it to verify your JS error handling displays the C# exception message.
  2. Remove or comment out the call to ThrowException in production code that was copied from the sample.
  3. In your own HybridWebView proxy methods, replace `throw new InvalidOperationException(...)` with proper error handling/logging if you do not want exceptions propagated to JS.

Example fix

// before (sample demo — intentionally throws)
public void ThrowException()
{
    throw new InvalidOperationException("This is a test exception thrown from C# code!");
}

// after (production-safe)
public void ThrowException()
{
    Debug.WriteLine("ThrowException requested — handling gracefully instead of throwing.");
    // handle the error case without throwing
}
Defensive patterns

Strategy: try-catch

Validate before calling

// This is intentional demo code — no validation needed in the sample.
// In production, avoid throwing from methods exposed to JS:
public void ThrowException()
{
    // Handle the error case gracefully instead of throwing
    Debug.WriteLine("Error condition handled gracefully.");
}

Try / catch

// JavaScript-side: catch the error from the C# proxy
try {
    await window.HybridWebView.InvokeDotNetAsync('ThrowException');
} catch (e) {
    console.error('C# threw:', e.message); // 'This is a test exception thrown from C# code!'
}

Prevention

When it happens

Trigger: JavaScript code in the HybridWebView calls the proxy method `ThrowException()` (or the async variant `ThrowExceptionAsync()`). The C# method throws InvalidOperationException which the HybridWebView bridge marshals back to the JS caller as a rejected promise or error callback.

Common situations: Running the HybridWebView sample and clicking the demo button that invokes the ThrowException method. This is expected behavior to test/showcase error handling across the JS-C# boundary.

Related errors


AI-assisted analysis of dotnet/maui@f377ff1c5e (2026-08-13). Data as JSON: /api/errors/e8287c764738dd30. Report an issue: GitHub.