Closed
Description
Background and Motivation
Scenarios like designers or REPLs that host user provided code are not able to handle unhandled exceptions thrown by the user provided code. Unhandled exceptions on finalizer thread, threadpool threads or user created threads will take down the whole process. This is not desirable experience for these type of scenarios.
The discussion that lead to this proposal is in #39587
Proposed API
Allow ignoring unhandled exceptions on threads created by the runtime from managed UnhandledException handler:
namespace System
{
public class UnhandledExceptionEventArgs
{
// Existing property. Always true in .NET Core today. The behavior will be changed to:
+ // - `false` for exceptions that can be ignored (ie thread was created by the runtime)
+ // - `true` for exceptions that cannot be ignored (ie foreign thread or other situations when it is not reasonably possible to continue execution)
// This behavior is close to .NET Framework 1.x behavior of this property.
public bool IsTerminating { get; }
+ // The default value is false. The event handlers can set it to true to make
+ // runtime ignore the exception. It has effect only when IsTerminating is false.
+ // The documentation will come with usual disclaimer for bad consequences of ignoring exceptions
+ public bool Ignore { get; set; }
}
}
Usage Examples
AppDomain.CurrentDomain.UnhandledException += (sender, e) =>
{
if (DesignMode && !e.IsTerminating)
{
DisplayException(e.ExceptionObject);
e.Ignore = true;
}
};
Alternative Designs
Unmanaged hosting API that enables this behavior. (CoreCLR has poorly documented and poorly tested configuration option for this today.)
Similar prior art:
UnobservedTaskExceptionEventArgs.Observed
+UnobservedTaskExceptionEventArgs.SetObserved
CancelEventArgs.Cancel
Risks
This API can be abused to ignore unhandled exceptions in scenarios where it is not warranted.
Metadata
Metadata
Assignees
Labels
Type
Projects
Status