Exemplo n.º 1
0
        public static bool RaiseContractFailedEvent(
            ContractFailureKind failureKind,
            string userMessage,
            string conditionText,
            Provenance provenence,
            out string resultFailureMessage)
        {
            bool   handled = false;
            string returnValue;
            string displayMessage             = "contract failed."; // Incomplete, but in case of OOM during resource lookup...
            ContractFailedEventArgs eventArgs = null;               // In case of OOM.

            try
            {
                displayMessage       = GetDisplayMessage(failureKind, userMessage, conditionText, provenence);
                resultFailureMessage = displayMessage;

                EventHandler <ContractFailedEventArgs> contractFailedEventLocal = ContractFailed;
                if (contractFailedEventLocal != null)
                {
                    eventArgs = new ContractFailedEventArgs(failureKind, displayMessage, conditionText);
                    foreach (EventHandler <ContractFailedEventArgs> handler in contractFailedEventLocal.GetInvocationList())
                    {
                        try
                        {
                            handler(null, eventArgs);
                        }
                        catch (Exception e)
                        {
                            eventArgs.ThrownDuringHandler = e;
                            eventArgs.SetUnwind();
                        }
                    }

                    if (eventArgs.Unwind)
                    {
                        // unwind
                        throw new ContractException(failureKind, displayMessage, userMessage, conditionText);
                    }
                }
            }
            finally
            {
                if (eventArgs != null && eventArgs.Handled)
                {
                    handled = true;
                }
                else
                {
                    returnValue = displayMessage;
                }
            }

            return(handled);
        }
        public static void ReportPreconditionFailure <TException>(string msg, string conditionTxt, Provenance provenence) where TException : Exception
#if !NETSTANDARD2_0
        // Previous version are relies on new constraint for exception construction.
        , new()
#endif
        {
            if (!RaiseContractFailedEvent(ContractFailureKind.Precondition, msg, conditionTxt, provenence, out var text))
            {
                string fullMessage = msg + conditionTxt;
                // TODO: need to cache the factory or maybe switch to reflection-based approach.
                var factory = GenerateExceptionFactory <TException>();
                throw factory(fullMessage);
            }
        }
 private static string GetFailureMessage(ContractFailureKind failureKind, string conditionText, Provenance provenence)
 {
     return(string.IsNullOrEmpty(conditionText)
         ? string.Format(CultureInfo.InvariantCulture, "{0}", failureKind.ToDisplayString())
         : string.Format(CultureInfo.InvariantCulture, "{0}: {1}", failureKind.ToDisplayString(), conditionText));
 }
        private static string GetDisplayMessage(ContractFailureKind failureKind, string userMessage, string conditionText, Provenance provenence)
        {
            string message = GetFailureMessage(failureKind, conditionText, provenence);

            return(string.IsNullOrEmpty(userMessage)
                ? string.Format(CultureInfo.InvariantCulture, "{0}.\r\n\tat {1}", message, provenence)
                : string.Format(CultureInfo.InvariantCulture, "{0}: {1}.\r\n\tat {2}", message, userMessage, provenence));
        }
 public static void ReportFailure(ContractFailureKind kind, string msg, string conditionTxt, Provenance provenance)
 {
     if (!RaiseContractFailedEvent(kind, msg, conditionTxt, provenance, out var text))
     {
         TriggerFailure(kind, text, msg, conditionTxt);
     }
 }