// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Diagnostics.Contracts; using System.Threading; using System.Threading.Tasks; using System.Web.Http.Properties; namespace System.Web.Http.ExceptionHandling { /// Represents an unhandled exception handler. public abstract class ExceptionHandler : IExceptionHandler { /// Task IExceptionHandler.HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) { if (context == null) { throw new ArgumentNullException("context"); } ExceptionContext exceptionContext = context.ExceptionContext; Contract.Assert(exceptionContext != null); if (!ShouldHandle(context)) { return TaskHelpers.Completed(); } return HandleAsync(context, cancellationToken); } /// When overridden in a derived class, handles the exception asynchronously. /// The exception handler context. /// The token to monitor for cancellation requests. /// A task representing the asynchronous exception handling operation. public virtual Task HandleAsync(ExceptionHandlerContext context, CancellationToken cancellationToken) { Handle(context); return TaskHelpers.Completed(); } /// When overridden in a derived class, handles the exception synchronously. /// The exception handler context. public virtual void Handle(ExceptionHandlerContext context) { } /// Determines whether the exception should be handled. /// The exception handler context. /// /// if the exception should be handled; otherwise, . /// /// The default decision is only to handle exceptions caught at top-level catch blocks. public virtual bool ShouldHandle(ExceptionHandlerContext context) { if (context == null) { throw new ArgumentNullException("context"); } ExceptionContext exceptionContext = context.ExceptionContext; Contract.Assert(exceptionContext != null); ExceptionContextCatchBlock catchBlock = exceptionContext.CatchBlock; return catchBlock.IsTopLevel; } } }