Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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