Skip to content

Commit eb0a580

Browse files
authored
Merge pull request EvilBeaver#1487 from sfaqer/feature/bgTasksCallStack
Стек вызовов в информации об ошибке фонового задания
2 parents 9cf7ebe + 6ae2564 commit eb0a580

File tree

4 files changed

+44
-0
lines changed

4 files changed

+44
-0
lines changed

src/OneScript.StandardLibrary/Tasks/BackgroundTask.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ public void ExecuteOnCurrentThread()
111111
catch (ScriptException exception)
112112
{
113113
State = TaskStateEnum.CompletedWithErrors;
114+
exception.RuntimeSpecificInfo = MachineInstance.Current.GetExecutionFrames();
114115
ExceptionInfo = new ExceptionInfoContext(exception);
115116
}
116117
}

src/ScriptEngine/Machine/Contexts/StackTraceCollectionContext.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ This Source Code Form is subject to the terms of the
88
using System.Collections.Generic;
99
using System.Linq;
1010
using OneScript.Contexts;
11+
using OneScript.Exceptions;
1112

1213
namespace ScriptEngine.Machine.Contexts
1314
{
@@ -30,6 +31,11 @@ internal StackTraceCollectionContext(IEnumerable<ExecutionFrameInfo> frames)
3031
}).ToList();
3132
}
3233

34+
/// <summary>
35+
/// Возвращает количество кадров в стеке вызовов
36+
/// </summary>
37+
/// <returns>Число - Количество кадров в стеке вызовов</returns>
38+
[ContextMethod("Количество", "Count")]
3339
public override int Count()
3440
{
3541
return _frames.Count;
@@ -39,5 +45,23 @@ public override IEnumerator<StackTraceItemContext> GetEnumerator()
3945
{
4046
return _frames.GetEnumerator();
4147
}
48+
49+
public override bool IsIndexed => true;
50+
51+
public override IValue GetIndexedValue(IValue index)
52+
{
53+
var idx = (int)index.AsNumber();
54+
55+
if (idx < 0 || idx >= Count())
56+
throw IndexOutOfBoundsException();
57+
58+
return _frames[idx];
59+
}
60+
61+
private static RuntimeException IndexOutOfBoundsException()
62+
{
63+
return new RuntimeException("Значение индекса выходит за пределы диапазона");
64+
}
65+
4266
}
4367
}

src/ScriptEngine/Machine/MachineInstance.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2451,6 +2451,7 @@ private IValue PopRawValue()
24512451

24522452
public IList<ExecutionFrameInfo> GetExecutionFrames()
24532453
{
2454+
CreateFullCallstack();
24542455
return _fullCallstackCache;
24552456
}
24562457

tests/tasks.os

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВозвращаетсяРезультатДелегата");
2525
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоРаботаетБлокировка");
2626
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоКодМожетОпределитьИДЗадания");
27+
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоВИнформацииОбОшибкеЕстьСтекВызовов");
2728
ВсеТесты.Добавить("ТестДолжен_ПроверитьЧтоОбработчикиСобытийВызываютсяВФоновомЗадании");
2829

2930
Возврат ВсеТесты;
@@ -271,6 +272,23 @@
271272

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

275+
Процедура ТестДолжен_ПроверитьЧтоВИнформацииОбОшибкеЕстьСтекВызовов() Экспорт
276+
277+
Задание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ПроцедураСИсключением");
278+
Задание.ОжидатьЗавершения();
279+
280+
СтекВызовов = Задание.ИнформацияОбОшибке.ПолучитьСтекВызовов();
281+
282+
юТест.ПроверитьТип(СтекВызовов, "КоллекцияКадровСтекаВызовов");
283+
284+
юТест.ПроверитьРавенство(СтекВызовов.Количество(), 1);
285+
286+
юТест.ПроверитьРавенство(СтекВызовов[0].Метод, "ПроцедураСИсключением");
287+
юТест.ПроверитьЗаполненность(СтекВызовов[0].НомерСтроки);
288+
юТест.ПроверитьРавенство(СтекВызовов[0].ИмяМодуля, ТекущийСценарий().Источник);
289+
290+
КонецПроцедуры
291+
274292
Процедура ТестДолжен_ПроверитьЧтоОбработчикиСобытийВызываютсяВФоновомЗадании() Экспорт
275293

276294
СобытиеВызвано = Ложь;

0 commit comments

Comments
 (0)