File: BackEnd\Components\ProjectCache\ProjectCacheException.cs
Web Access
Project: ..\..\..\src\Build\Microsoft.Build.csproj (Microsoft.Build)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System;
using Microsoft.Build.Framework.BuildException;
using Microsoft.Build.Shared;
 
#nullable disable
 
namespace Microsoft.Build.Experimental.ProjectCache
{
    /// <summary>
    /// This exception is used to wrap an unhandled exception from a project cache plugin. This exception aborts the build, and it can only be
    /// thrown by the MSBuild engine.
    /// </summary>
    public sealed class ProjectCacheException : BuildExceptionBase
    {
        private ProjectCacheException()
        {
            ErrorUtilities.ThrowInternalErrorUnreachable();
        }
 
        private ProjectCacheException(
            string message,
            Exception innerException,
            bool hasBeenLoggedByProjectCache,
            string errorCode)
            : base(message, innerException)
        {
            ErrorUtilities.VerifyThrow(!string.IsNullOrEmpty(message), "Need error message.");
            ErrorUtilities.VerifyThrow(!string.IsNullOrEmpty(errorCode), "Must specify the error message code.");
 
            HasBeenLoggedByProjectCache = hasBeenLoggedByProjectCache;
            ErrorCode = errorCode;
        }
 
        internal ProjectCacheException(string message, Exception inner)
            : base(message, inner)
        { }
 
        /// <summary>
        /// The project cache has already logged this as an error.
        /// Should not get logged again.
        /// </summary>
        public bool HasBeenLoggedByProjectCache { get; }
 
        /// <summary>
        /// Gets the error code associated with this exception's message (not the inner exception).
        /// </summary>
        /// <value>The error code string.</value>
        public string ErrorCode { get; }
 
        internal static void ThrowAsUnhandledException(
            Exception innerException,
            string messageResourceName,
            params string[] messageArgs)
        {
            ErrorUtilities.VerifyThrow(messageResourceName != null, "Need error message.");
 
            string message = ResourceUtilities.FormatResourceStringStripCodeAndKeyword(out var errorCode, out _, messageResourceName, messageArgs);
 
            throw new ProjectCacheException(message, innerException, hasBeenLoggedByProjectCache: false, errorCode);
        }
 
        internal static void ThrowForErrorLoggedInsideTheProjectCache(
            string messageResourceName,
            params string[] messageArgs)
        {
            ErrorUtilities.VerifyThrow(messageResourceName != null, "Need error message.");
 
            string message = ResourceUtilities.FormatResourceStringStripCodeAndKeyword(out var errorCode, out _, messageResourceName, messageArgs);
 
            throw new ProjectCacheException(message: message, innerException: null, hasBeenLoggedByProjectCache: true, errorCode: errorCode);
        }
 
        internal static void ThrowForMSBuildIssueWithTheProjectCache(
            string messageResourceName,
            params string[] messageArgs)
        {
            ErrorUtilities.VerifyThrow(messageResourceName != null, "Need error message.");
 
            string message = ResourceUtilities.FormatResourceStringStripCodeAndKeyword(out var errorCode, out _, messageResourceName, messageArgs);
 
            throw new ProjectCacheException(message: message, innerException: null, hasBeenLoggedByProjectCache: false, errorCode: errorCode);
        }
    }
}