private void ForwardKnownExceptions(Action operation, Func <Exception, bool> ignoreExceptionOperation = null)
        {
            Exception failure = null;

            try
            {
                CommonUtils.CatchKnownExceptions(operation, delegate(Exception f)
                {
                    failure = f;
                });
            }
            catch (Exception ex)
            {
                MrsTracer.Service.Error("Unhandled exception in MRS:\n{0}\n{1}", new object[]
                {
                    CommonUtils.FullExceptionMessage(ex),
                    ex.StackTrace
                });
                ExWatson.SendReport(ex);
                throw;
            }
            if (failure != null && (ignoreExceptionOperation == null || !ignoreExceptionOperation(failure)))
            {
                MailboxReplicationServiceFault.Throw(failure);
            }
        }
        private static MailboxReplicationServiceFault Create(Exception ex)
        {
            if (ex == null)
            {
                return(null);
            }
            MailboxReplicationServiceFault mailboxReplicationServiceFault = new MailboxReplicationServiceFault();

            if (ex is LocalizedException)
            {
                mailboxReplicationServiceFault.MessageData = CommonUtils.ByteSerialize(((LocalizedException)ex).LocalizedString);
            }
            else
            {
                mailboxReplicationServiceFault.MessageData = CommonUtils.ByteSerialize(new LocalizedString(ex.Message));
            }
            mailboxReplicationServiceFault.Side              = (ExecutionContext.GetExceptionSide(ex) ?? ExceptionSide.None);
            mailboxReplicationServiceFault.ExceptionType     = CommonUtils.GetFailureType(ex);
            mailboxReplicationServiceFault.StackTrace        = ex.StackTrace;
            mailboxReplicationServiceFault.DataContextData   = CommonUtils.ByteSerialize(new LocalizedString(ExecutionContext.GetDataContext(ex)));
            mailboxReplicationServiceFault.ErrorCode         = CommonUtils.HrFromException(ex);
            mailboxReplicationServiceFault.MapiLowLevelError = CommonUtils.GetMapiLowLevelError(ex);
            mailboxReplicationServiceFault.MrsErrorType      = MailboxReplicationServiceFault.ClassifyException(ex);
            WellKnownException[] array = CommonUtils.ClassifyException(ex);
            mailboxReplicationServiceFault.WKEClasses = new int[array.Length];
            for (int i = 0; i < array.Length; i++)
            {
                mailboxReplicationServiceFault.WKEClasses[i] = (int)array[i];
            }
            StaticCapacityExceededReservationException ex2 = ex as StaticCapacityExceededReservationException;

            if (ex2 != null)
            {
                mailboxReplicationServiceFault.ResourceName = ex2.ResourceName;
                mailboxReplicationServiceFault.ResourceType = ex2.ResourceType;
                mailboxReplicationServiceFault.Capacity     = ex2.Capacity;
            }
            WlmCapacityExceededReservationException ex3 = ex as WlmCapacityExceededReservationException;

            if (ex3 != null)
            {
                mailboxReplicationServiceFault.ResourceName          = ex3.ResourceName;
                mailboxReplicationServiceFault.ResourceType          = ex3.ResourceType;
                mailboxReplicationServiceFault.WlmResourceKey        = ex3.WlmResourceKey;
                mailboxReplicationServiceFault.WlmResourceMetricType = ex3.WlmResourceMetricType;
                mailboxReplicationServiceFault.Capacity = ex3.Capacity;
            }
            WlmResourceUnhealthyException ex4 = ex as WlmResourceUnhealthyException;

            if (ex4 != null)
            {
                mailboxReplicationServiceFault.ResourceName          = ex4.ResourceName;
                mailboxReplicationServiceFault.ResourceType          = ex4.ResourceType;
                mailboxReplicationServiceFault.WlmResourceKey        = ex4.WlmResourceKey;
                mailboxReplicationServiceFault.WlmResourceMetricType = ex4.WlmResourceMetricType;
                mailboxReplicationServiceFault.LoadRatio             = ex4.ReportedLoadRatio;
                mailboxReplicationServiceFault.LoadState             = ex4.ReportedLoadState;
                mailboxReplicationServiceFault.LoadMetric            = ex4.Metric;
            }
            mailboxReplicationServiceFault.InnerException = MailboxReplicationServiceFault.Create(ex.InnerException);
            return(mailboxReplicationServiceFault);
        }
        public static void Throw(Exception ex)
        {
            MailboxReplicationServiceFault mailboxReplicationServiceFault = MailboxReplicationServiceFault.Create(ex);

            throw new FaultException <MailboxReplicationServiceFault>(mailboxReplicationServiceFault, mailboxReplicationServiceFault.Message);
        }