File: ExceptionConverter.cs
Web Access
Project: src\vstest\src\Microsoft.TestPlatform.ObjectModel\Microsoft.TestPlatform.ObjectModel.csproj (Microsoft.VisualStudio.TestPlatform.ObjectModel)
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

using System;

namespace Microsoft.VisualStudio.TestPlatform.ObjectModel;

/// <summary>
/// Base exception for all Rocksteady service exceptions
/// </summary>
#if NETFRAMEWORK
[Serializable]
#endif
public class TestPlatformException : Exception
{
    public TestPlatformException(string? message)
        : base(message)
    {
    }

    public TestPlatformException(string? message, Exception? innerException)
        : base(message, innerException)
    {
    }
}

#if FullCLR
    /// <summary>
    /// This class converts WCF fault exception to a strongly-typed exception
    /// </summary>
    public static class ExceptionConverter
    {
        /// <summary>
        /// This method converts WCF fault exception to a strongly-typed exception
        /// </summary>
        /// <param name="faultEx">FaultException</param>
        /// <returns>strongly typed exception that is wrapped in Fault Exception</returns>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods", MessageId = "0")]
        public static Exception ConvertException(FaultException faultEx)
        {
            ValidateArg.NotNull(faultEx, nameof(faultEx));
            if (faultEx.Code == null || faultEx.Code.Name == null)
            {
                return new TestPlatformException(faultEx.Message, faultEx);
            }
            return ConvertException(faultEx.Code.Name, faultEx.Message, faultEx);
        }

        /// <summary>
        /// Creates a strongly-typed exception that is represented by the exception name
        /// passed as parameter
        /// </summary>
        /// <param name="exceptionType">Exception type class name</param>
        /// <param name="message">message of exception</param>
        /// <param name="innerException">actual exception that is to be wrapped</param>
        /// <returns>actual exception that is represented by the exception name</returns>
        [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes", Justification = "Instantiating an instance of Exception class")]
        private static Exception ConvertException(string exceptionType, string message, Exception innerException)
        {
            try
            {
                string className = rocksteadyExceptionNameSpace + "." + exceptionType;
                Type t = typeof(Microsoft.VisualStudio.TestPlatform.Common.TestRunner.TestPlatformException);
                string assembly = Assembly.GetAssembly(t).FullName;

                System.Runtime.Remoting.ObjectHandle handle = Activator.CreateInstance(assembly, className, true,
                                0, null, new object[] { message, innerException }, CultureInfo.InvariantCulture, null, null);
                return ((TestPlatformException)handle.Unwrap());
            }
            catch (Exception)
            {
                // Ignore it, and try to get System.Exception
            }

            try
            {
                string className = "System" + "." + exceptionType;
                Type t = typeof(System.Exception);
                string assembly = Assembly.GetAssembly(t).FullName;

                System.Runtime.Remoting.ObjectHandle handle = Activator.CreateInstance(assembly, className, true,
                                0, null, new object[] { message, innerException }, CultureInfo.InvariantCulture, null, null);
                Exception tempEx = (Exception)handle.Unwrap();
                return tempEx;
            }
            catch (Exception)
            {
                // Neither System nor TestPlatformException, but still pass it as TestPlatformException
                return new TestPlatformException(message, innerException);
            }
        }

        private const string rocksteadyExceptionNameSpace = "Microsoft.VisualStudio.TestPlatform.Core.TestRunner";
    }
#endif

#if NETFRAMEWORK
[Serializable]
#endif
public class ProcessExitedException : TestPlatformException
{
    public ProcessExitedException(string? message) : base(message) { }
    public ProcessExitedException(string? message, Exception? inner) : base(message, inner) { }
}