// 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;
}
}
}