Skip to content

Commit 0d2445c

Browse files
authored
Merge pull request EvilBeaver#1494 from sfaqer/feature/execInfoCause
В конструктор ИнформацияОбОшибке, добавлен параметр "Причина" для возможности указания причины текущей ошибки
2 parents 62c8464 + 380dd6b commit 0d2445c

File tree

5 files changed

+70
-10
lines changed

5 files changed

+70
-10
lines changed

src/ScriptEngine/Machine/Contexts/ExceptionInfoContext.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,11 @@ public ExceptionInfoContext(ScriptException source) : base(ObjectType)
3333
SetActualException(source);
3434
}
3535

36-
private ExceptionInfoContext(string message, IValue parameters) : base(ObjectType)
36+
private ExceptionInfoContext(string message, IValue parameters, ExceptionInfoContext cause) : base(ObjectType)
3737
{
3838
Description = message;
3939
Parameters = parameters;
40+
_innerException = cause;
4041
}
4142

4243
public bool IsErrorTemplate => _exc == null;
@@ -48,10 +49,11 @@ private void SetActualException(ScriptException exception)
4849
if (exception is ParametrizedRuntimeException pre)
4950
{
5051
Parameters = pre.Parameter;
52+
_innerException = pre.Cause;
5153
}
5254
}
5355

54-
private ScriptException ActualException()
56+
public ScriptException ActualException()
5557
{
5658
if (IsErrorTemplate)
5759
{
@@ -147,8 +149,8 @@ public IValue InnerException
147149

148150
private IValue CreateInnerExceptionInfo()
149151
{
150-
var exc = ActualException();
151-
if (exc.InnerException == null)
152+
var exc = _exc;
153+
if (exc?.InnerException == null)
152154
return ValueFactory.Create();
153155

154156
var alreadyWrapped = ActualException() is ExternalSystemException;
@@ -193,11 +195,17 @@ public override string ToString()
193195
return Description;
194196
}
195197

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

203211
public static ExceptionInfoContext EmptyExceptionInfo()

src/ScriptEngine/Machine/ExceptionInfoFactory.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public Exception Raise(object raiseValue)
4848
return raiseValue switch
4949
{
5050
ExceptionInfoContext { IsErrorTemplate: true } excInfo =>
51-
new ParametrizedRuntimeException(excInfo.Description, excInfo.Parameters),
51+
new ParametrizedRuntimeException(excInfo.Description, excInfo.Parameters, excInfo.InnerException),
5252
BslValue bslVal => new RuntimeException(bslVal.AsString()),
5353
_ => new RuntimeException(raiseValue.ToString())
5454
};

src/ScriptEngine/Machine/MachineInstance.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1252,7 +1252,11 @@ private void RaiseException(int arg)
12521252
var exceptionValue = _operationStack.Pop().GetRawValue();
12531253
if (exceptionValue is ExceptionInfoContext { IsErrorTemplate: true } excInfo)
12541254
{
1255-
throw new ParametrizedRuntimeException(excInfo.Description, excInfo.Parameters);
1255+
throw new ParametrizedRuntimeException(
1256+
excInfo.Description,
1257+
excInfo.Parameters,
1258+
excInfo.InnerException
1259+
);
12561260
}
12571261
else
12581262
{

src/ScriptEngine/Machine/ParametrizedRuntimeException.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,19 @@ This Source Code Form is subject to the terms of the
66
----------------------------------------------------------*/
77

88
using OneScript.Exceptions;
9+
using ScriptEngine.Machine.Contexts;
910

1011
namespace ScriptEngine.Machine
1112
{
1213
public class ParametrizedRuntimeException : RuntimeException
1314
{
14-
public ParametrizedRuntimeException(string msg, IValue parameter) : base(msg)
15+
public ParametrizedRuntimeException(string msg, IValue parameter, IValue cause = null) : base(msg)
1516
{
1617
Parameter = parameter;
18+
Cause = cause;
1719
}
1820

1921
public IValue Parameter { get; private set; }
22+
public IValue Cause { get; private set; }
2023
}
2124
}

tests/global-funcs.os

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@
7777
ВсеТесты.Добавить("Тест_ДолженПроверитьИнформацияОбОшибкеОписание");
7878
ВсеТесты.Добавить("Тест_ДолженПроверитьКраткоеПредставлениеОшибки");
7979
ВсеТесты.Добавить("Тест_ДолженПроверитьПодробноеПредставлениеОшибки");
80+
ВсеТесты.Добавить("Тест_ДолженПроверитьИнформацияОбОшибкеСПричиной");
8081

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

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

892+
Процедура Тест_ДолженПроверитьИнформацияОбОшибкеСПричиной() Экспорт
893+
894+
Попытка
895+
ВыброситьТестовоеИсключение();
896+
Исключение
897+
ИнформацияОбОшибкеОригинальная = ИнформацияОбОшибке();
898+
КонецПопытки;
899+
900+
юТест.ПроверитьИстину(ЗначениеЗаполнено(ИнформацияОбОшибкеОригинальная), "Исключение не было брошено");
901+
902+
Объект = Новый ИнформацияОбОшибке("Я новая ошибка", Новый Массив, ИнформацияОбОшибкеОригинальная);
903+
904+
Попытка
905+
ВызватьИсключение Объект;
906+
Исключение
907+
ИнформацияОбОшибке = ИнформацияОбОшибке();
908+
909+
юТест.ПроверитьИстину(
910+
СтрНайти(ИнформацияОбОшибке.Описание, "Я новая ошибка") > 0,
911+
"Описание в новой информации об ошибке должно быть текстом из конструктора"
912+
);
913+
914+
юТест.ПроверитьТип(
915+
ИнформацияОбОшибке.Причина,
916+
"ИнформацияОбОшибке",
917+
"У информации об ошибке которому передали причину в конструкторе,
918+
|должна быть заполнена причина после выброса исключения"
919+
);
920+
921+
юТест.ПроверитьРавенство(
922+
ИнформацияОбОшибке.Причина,
923+
ИнформацияОбОшибкеОригинальная,
924+
"Причина в новой информации об ошибке должна соответствовать переданной в конструктор"
925+
);
926+
927+
юТест.ПроверитьИстину(
928+
СтрНайти(ИнформацияОбОшибке.Причина.Описание, "тест-тест-тест") > 0,
929+
"Оригинальное сообщение должно содержать текст исключения"
930+
);
931+
932+
КонецПопытки;
933+
934+
КонецПроцедуры
935+
891936
Процедура Тест_ДолженПроверитьОбъединениеПутей() Экспорт
892937
СИ = Новый СистемнаяИнформация();
893938
Если Найти(СИ.ВерсияОС,"Windows") > 0 Тогда

0 commit comments

Comments
 (0)