Skip to content

Commit

Permalink
Merge pull request #1494 from sfaqer/feature/execInfoCause
Browse files Browse the repository at this point in the history
В конструктор ИнформацияОбОшибке, добавлен параметр "Причина" для возможности указания причины текущей ошибки
  • Loading branch information
EvilBeaver authored Jan 20, 2025
2 parents 62c8464 + 380dd6b commit 0d2445c
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 10 deletions.
22 changes: 15 additions & 7 deletions src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,10 +33,11 @@ public ExceptionInfoContext(ScriptException source) : base(ObjectType)
SetActualException(source);
}

private ExceptionInfoContext(string message, IValue parameters) : base(ObjectType)
private ExceptionInfoContext(string message, IValue parameters, ExceptionInfoContext cause) : base(ObjectType)
{
Description = message;
Parameters = parameters;
_innerException = cause;
}

public bool IsErrorTemplate => _exc == null;
Expand All @@ -48,10 +49,11 @@ private void SetActualException(ScriptException exception)
if (exception is ParametrizedRuntimeException pre)
{
Parameters = pre.Parameter;
_innerException = pre.Cause;
}
}

private ScriptException ActualException()
public ScriptException ActualException()
{
if (IsErrorTemplate)
{
Expand Down Expand Up @@ -147,8 +149,8 @@ public IValue InnerException

private IValue CreateInnerExceptionInfo()
{
var exc = ActualException();
if (exc.InnerException == null)
var exc = _exc;
if (exc?.InnerException == null)
return ValueFactory.Create();

var alreadyWrapped = ActualException() is ExternalSystemException;
Expand Down Expand Up @@ -193,11 +195,17 @@ public override string ToString()
return Description;
}


/// <summary>
///
/// </summary>
/// <param name="msg">Строка - Сообщение об ошибке</param>
/// <param name="parameter">Произвольный - Дополнительная информация</param>
/// <param name="cause">ИнформацияОбОшибке - Причина, по которой произошло текущее исключение</param>
/// <returns></returns>
[ScriptConstructor(Name = "С возможностью передачи параметров")]
public static ExceptionInfoContext Create(IValue msg, IValue parameter)
public static ExceptionInfoContext Create(IValue msg, IValue parameter, ExceptionInfoContext cause = null)
{
return new ExceptionInfoContext(msg.AsString(), parameter);
return new ExceptionInfoContext(msg.AsString(), parameter, cause);
}

public static ExceptionInfoContext EmptyExceptionInfo()
Expand Down
2 changes: 1 addition & 1 deletion src/ScriptEngine/Machine/ExceptionInfoFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public Exception Raise(object raiseValue)
return raiseValue switch
{
ExceptionInfoContext { IsErrorTemplate: true } excInfo =>
new ParametrizedRuntimeException(excInfo.Description, excInfo.Parameters),
new ParametrizedRuntimeException(excInfo.Description, excInfo.Parameters, excInfo.InnerException),
BslValue bslVal => new RuntimeException(bslVal.AsString()),
_ => new RuntimeException(raiseValue.ToString())
};
Expand Down
6 changes: 5 additions & 1 deletion src/ScriptEngine/Machine/MachineInstance.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1252,7 +1252,11 @@ private void RaiseException(int arg)
var exceptionValue = _operationStack.Pop().GetRawValue();
if (exceptionValue is ExceptionInfoContext { IsErrorTemplate: true } excInfo)
{
throw new ParametrizedRuntimeException(excInfo.Description, excInfo.Parameters);
throw new ParametrizedRuntimeException(
excInfo.Description,
excInfo.Parameters,
excInfo.InnerException
);
}
else
{
Expand Down
5 changes: 4 additions & 1 deletion src/ScriptEngine/Machine/ParametrizedRuntimeException.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,19 @@ This Source Code Form is subject to the terms of the
----------------------------------------------------------*/

using OneScript.Exceptions;
using ScriptEngine.Machine.Contexts;

namespace ScriptEngine.Machine
{
public class ParametrizedRuntimeException : RuntimeException
{
public ParametrizedRuntimeException(string msg, IValue parameter) : base(msg)
public ParametrizedRuntimeException(string msg, IValue parameter, IValue cause = null) : base(msg)
{
Parameter = parameter;
Cause = cause;
}

public IValue Parameter { get; private set; }
public IValue Cause { get; private set; }
}
}
45 changes: 45 additions & 0 deletions tests/global-funcs.os
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,7 @@
ВсеТесты.Добавить("Тест_ДолженПроверитьИнформацияОбОшибкеОписание");
ВсеТесты.Добавить("Тест_ДолженПроверитьКраткоеПредставлениеОшибки");
ВсеТесты.Добавить("Тест_ДолженПроверитьПодробноеПредставлениеОшибки");
ВсеТесты.Добавить("Тест_ДолженПроверитьИнформацияОбОшибкеСПричиной");

ВсеТесты.Добавить("Тест_ДолженПроверитьОбъединениеПутей");

Expand Down Expand Up @@ -888,6 +889,50 @@
ВызватьИсключение "Исключение не было брошено";
КонецПроцедуры

Процедура Тест_ДолженПроверитьИнформацияОбОшибкеСПричиной() Экспорт

Попытка
ВыброситьТестовоеИсключение();
Исключение
ИнформацияОбОшибкеОригинальная = ИнформацияОбОшибке();
КонецПопытки;

юТест.ПроверитьИстину(ЗначениеЗаполнено(ИнформацияОбОшибкеОригинальная), "Исключение не было брошено");

Объект = Новый ИнформацияОбОшибке("Я новая ошибка", Новый Массив, ИнформацияОбОшибкеОригинальная);

Попытка
ВызватьИсключение Объект;
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();

юТест.ПроверитьИстину(
СтрНайти(ИнформацияОбОшибке.Описание, "Я новая ошибка") > 0,
"Описание в новой информации об ошибке должно быть текстом из конструктора"
);

юТест.ПроверитьТип(
ИнформацияОбОшибке.Причина,
"ИнформацияОбОшибке",
"У информации об ошибке которому передали причину в конструкторе,
|должна быть заполнена причина после выброса исключения"
);

юТест.ПроверитьРавенство(
ИнформацияОбОшибке.Причина,
ИнформацияОбОшибкеОригинальная,
"Причина в новой информации об ошибке должна соответствовать переданной в конструктор"
);

юТест.ПроверитьИстину(
СтрНайти(ИнформацияОбОшибке.Причина.Описание, "тест-тест-тест") > 0,
"Оригинальное сообщение должно содержать текст исключения"
);

КонецПопытки;

КонецПроцедуры

Процедура Тест_ДолженПроверитьОбъединениеПутей() Экспорт
СИ = Новый СистемнаяИнформация();
Если Найти(СИ.ВерсияОС,"Windows") > 0 Тогда
Expand Down

0 comments on commit 0d2445c

Please sign in to comment.