public static Guid A(Exception ex, Endeme actions, GuiActionTrace gat) { return(A(ex, actions, _eventSource, gat)); } /// <param name="level">level of error: 18 if generally good for programmer warnings, 21 is good for critical user level errors</param>
} /// <param name="level">level of error: 18 if generally good for programmer warnings, 21 is good for critical user level errors</param> public static Guid A(Exception ex, GuiActionTrace gat) { return(A(ex, _actions, _eventSource, gat)); } /// <param name="level">level of error: 18 if generally good for programmer warnings, 21 is good for critical user level errors</param><param name="actions">D)atalog, E)ventlog, G)ATtrace, I)gnore, eM)ail, N)one, P)ause, S)quawk, T)hrows</param>
// ---------------------------------------------------------------------------------------- /// <!-- A --> /// <summary> /// Provides a breakpoint in development and throws an exception in production /// </summary> /// <param name="e">exception</param> /// <param name="actions">bug action</param> /// <returns>The id in the database if sent to the database</returns> public static Guid A(Exception ex, Endeme actions, EventSourceCreationData eventSource , GuiActionTrace gat) { if (_exceptionAct == null) { FillExceptionAct(); } // -------------------------------------------------------------------------- // Handle missing exception actions with a default Squawk-Log-Pause // -------------------------------------------------------------------------- if (_actions == null) { _actions = "" + Squawk + EventLog + Pauses; } if (actions == null) { actions = _actions; } // -------------------------------------------------------------------------- // Handle missing event log operational data by complaining // -------------------------------------------------------------------------- if (eventSource == null) { throw new NoNullAllowedException("EventSourceCreationData is null!" + "\r\n" + " You may have to add code something like this before running Throw:" + "\r\n" + " Throw.EventSourceBuild(\"MyProj\", \"MyProLog\");" ); } Guid guid = Guid.Empty; string strGat = ""; // -------------------------------------------------------------------------- // Prepare message text // -------------------------------------------------------------------------- string msg = ""; if (ex.InnerException != null) { msg = ex.InnerException.GetType().ToString() + "\r\n" + ex.InnerException.Message + "\r\n" + "\r\n" + ex.Message; } else { msg = ex.GetType().ToString() + " - " + ex.Message; } // -------------------------------------------------------------------------- // Determine action level // -------------------------------------------------------------------------- //int idx = actions.ToString().IndexOf('L'); //if (idx < 0) idx = 11; //int actionLevel; //if (idx >= 0) actionLevel = 22 - idx; //else actionLevel = 20; // default action level, action level is a callable/programmable cutoff point //// N is a mandatory cutoff point // -------------------------------------------------------------------------- // This is how to do it with an endeme // -------------------------------------------------------------------------- if (msg != _lastMessage && // don't keep spewing out the same messages msg != _prevMessage && !Regex.IsMatch(msg, "Deadlock victim", RegexOptions.IgnoreCase)) // I don't want to hear about deadlock victims { char[] act = actions.ToCharArray(); bool run = true; for (int i = 0; run && i < act.Length; ++i) { switch (act[i]) { //case DataLog: guid = SendToDatabase("CodeWhite", msg, strGat); break; case EventLog: SendToActionLog(msg, eventSource, strGat); break; case Ignore: break; case Email: break; case None: run = false; break; case Pauses: Pause(); break; // set a breakpoint here case Squawk: MessageBox.Show(msg); break; case Throws: throw ex; // turn this on in production and make sure it's handled } } } _prevMessage = _lastMessage; _lastMessage = msg; return(guid); }