//Добавляет ошибку в ErrorsList private void LogToErrorsList(ErrorCommand er) { try { DateTime t = DateTime.Now; if (ErrorsRec != null) { ErrorsRec.AddNew(); ErrorsRec.Put("Description", er.Text); ErrorsRec.Put("Params", er.ToLog()); ErrorsRec.Put("Time", t); if (CommandLog != null) { ErrorsRec.Put("Command", CommandLog.Name); ErrorsRec.Put("Context", CommandLog.Context); } if (CommandSubLog != null) { ErrorsRec.Put("PeriodBegin", CommandSubLog.PeriodBegin); ErrorsRec.Put("PeriodEnd", CommandSubLog.PeriodEnd); } ErrorsRec.Update(); } LogErrorsSpecial(er, t, CommandLog); } catch (Exception ex) { AddErrorAboutHistory(ex); } }
//Добавляет ошибку er в комманду public ErrorCommand AddError(ErrorCommand er) { foreach (var e in Errors) { if (e.Text == er.Text && e.Params == er.Params && e.IsFatal == er.IsFatal) { return(e); } } Errors.Add(er); if (er.Context.IsEmpty()) { var c = this; while (c != null && !(c is CommandLog)) { c = c.Parent; } if (c != null) { er.Context = ((CommandLog)c).Context; } } if (er.IsFatal) { Quality = CommandQuality.Error; } else if (Quality == CommandQuality.Success) { Quality = CommandQuality.Warning; } return(er); }
//Добавляет Ошибку в лог private void LogError(ErrorCommand er) { try { if (SuperHistory != null) { SuperHistory.AddNew(); if (HistoryId > 0) { SuperHistory.Put("HistoryId", HistoryId); } SuperHistory.Put("Description", er.Text); SuperHistory.Put("Params", er.ToLog()); SuperHistory.Put("Time", DateTime.Now); if (CommandLog != null) { SuperHistory.Put("FromStart", CommandLog.FromEvent); } SuperHistory.Put("Status", "Ошибка"); SuperHistory.Update(); } } catch (Exception ex) { AddErrorAboutHistory(ex); } }
//Добавляет ошибку в комманду, лог и отображение, er - ошибка, public void AddError(ErrorCommand er) { bool danger = false; var c = Command; while (c != null) { danger |= c.Behaviour == CommandBehaviour.Danger; if (c.Behaviour == CommandBehaviour.Log) { LogError(er); if (danger) { break; } if (_useErrorsList) { LogToErrorsList(er); MessageError(er); } } c.AddError(er); c = c.Parent; } }
//Запускает опасную операцию, Однопоточный вариант //Возвращает true, если операция прошла успешно (может не с первого раза) //operation - операция, которую нужно выполнить, возвращает True если все успешно //repetitions - сколько раз повторять, если не удалась (вместе с первым) //errorOperation - операция, выполняемя между повторами, errorWaiting - сколько мс ждать при ошибке public bool Danger(Func <bool> operation, int repetitions, int errorWaiting = 0, string errMess = "Не удалось выполнить опасную операцию", Func <bool> errorOperation = null) { //Выполняем первый раз var dan = RunDanger(operation, null); if (!dan.IsError) { return(true); } bool b = true; ErrorCommand err = dan.Errors.First(); for (int i = 2; i <= repetitions && b; i++) { //Выполняем последующие разы Command.IsRepeated = true; if (errorWaiting < 3000) { Thread.Sleep(errorWaiting); } else { double p = Procent; for (int j = 0; j < errorWaiting / 500; j++) { Procent = j * 100 * (500.0 / errorWaiting); Thread.Sleep(500); } Procent = p; } AddEvent("Повтор опасной операции", i + "-й раз"); b &= RunDanger(operation, errorOperation).IsError; } if (b && CommandLog != null) { var lerr = new ErrorCommand(errMess); CommandLog.AddError(lerr); LogError(lerr); if (_useErrorsList) { LogToErrorsList(lerr); MessageError(lerr); } var c = CommandLog.Parent; while (c != null) { c.AddError(err); c = c.Parent; } } return(!b); }
//Добавить в комманду ошибку error, isRepeated - ошибка произошла в повторяемой операции public override void AddError(ErrorCommand error, bool isRepeated) { ChangeQuality(error, isRepeated); if (!isRepeated) { bool isFound = false; foreach (var err in _errors) { if (err.EqualsTo(error)) { isFound = true; } } if (!isFound) { _errors.Add(error); } } }
protected override void MessageError(ErrorCommand er) { }
//Добавляет Ошибку в сообщения protected abstract void MessageError(ErrorCommand er);
//Запись в ошибки SQL-базу protected virtual void LogErrorsSpecial(ErrorCommand er, DateTime time, CommandLog command) { }