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