public object Create(IEnumerable<KeyValuePair<string, object>> arguments) { var list = new LogicErrorList(LogicErrorType.Internal); var res=Create(arguments, list); list.ThrowException(LogicErrorLevel.Error); return res; }
public static void CheckConsistancy(object obj, LogicErrorList list) { TreeRunDown(new FieldAddress(), obj, (a, o) => { if (o is ICheckable) { list.SetAddress(a); (o as ICheckable).CheckSelfConsistancy(list); } }, null); }
protected override void ContextParse(TextMold mold, Type type, LogicErrorList errors) { var cat = TypeResolver.GetResolver(type).Category; if (mold.Value == null) return; if (cat == Categories.Field) return; var p = mold.Value; switch (cat) { case Categories.Dictionary: case Categories.Node: if (!fieldRegex.Match(mold.Value).Success) { errors.Add(LogicErrorLevel.Error, string.Format("Неправильное присвоение {0}. Строка: {1}", cat.ToString(), p)); return; } p.Split(' ').ToList().ForEach( a => { if (a.Length == 0) return; var pairs = a.Split(':').Select(b => b.Trim()); if (pairs.Count() < 2) errors.Add(LogicErrorLevel.Error, string.Format("Неверный формат описания.\nОбрабатываемая строка: {1}\nОшибка: {2}", mold.Address.GetDottedString(), p, a)); else { var newAddr = new FieldAddress(pairs.First()); newAddr = mold.Address.Child(newAddr); GetMold(newAddr).Value = pairs.Last(); } } ); return; case Categories.Tensor: case Categories.List: var parts = p.Split('|'); for (int i = 0; i < parts.Length; ++i) GetMold(mold.Address.Child(i.ToString())).Value = parts[i]; return; } }
/// <summary> /// Создает исключение с указанным списком ошибок /// </summary> public LogicException(LogicErrorList list) : base(list.CreateText()) { ErrorList = list; }
public abstract object Create(IEnumerable<KeyValuePair<string, object>> arguments, LogicErrorList list);
public void SetElementAndProcessErrors(object obj, string sub, object value, LogicErrorList errors) { try { SetElement(obj, sub, value); } catch (Exception e) { //развернуть ошибку TargetInvokation, тип всегда error, если листа нет, то выбросить внутренний эксепшн // Если не установлен список ошибок в ThornadoDispatch // то добавленную туда ошибку, вероятно, никто не ждет // поэтому громко сообщаем о ней пробросом эксепшена наружу if (errors == null) { throw new Exception(e.InnerException.Message); } // Приводим полученное исключение к типу ThornadoException, // если это возможно try { var thornadoException = (ThornadoException)e.InnerException; errors.Add( thornadoException.Level, thornadoException.Message); } catch { if (e.InnerException != null) // Иначе полученное исключение общего вида errors.Add( LogicErrorLevel.Error, e.InnerException.Message); else errors.Add( LogicErrorLevel.Error, e.Message); } } }