Skip to content

Commit f1f9636

Browse files
committed
Перенесен фикс #1498
1 parent a6be992 commit f1f9636

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

src/ScriptEngine/Compiler/Compiler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1111,7 +1111,7 @@ private void BuildTryExceptStatement()
11111111
BuildCodeBatch(Token.EndTry);
11121112

11131113
var endIndex = AddLineNumber(_lastExtractedLexem.LineNumber, CodeGenerationFlags.CodeStatistics | CodeGenerationFlags.DebugCode);
1114-
AddCommand(OperationCode.EndTry);
1114+
AddCommand(OperationCode.EndTry, beginHandler);
11151115
CorrectCommandArgument(jmpIndex, endIndex);
11161116

11171117
NextToken();

src/ScriptEngine/Machine/MachineInstance.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1354,8 +1354,12 @@ private void BeginTry(int exceptBlockAddress)
13541354

13551355
private void EndTry(int arg)
13561356
{
1357-
if (_exceptionsStack.Count > 0 && _exceptionsStack.Peek().handlerFrame == _currentFrame)
1358-
_exceptionsStack.Pop();
1357+
if (_exceptionsStack.Count > 0)
1358+
{
1359+
var jmpInfo = _exceptionsStack.Peek();
1360+
if (jmpInfo.handlerFrame == _currentFrame && arg == jmpInfo.handlerAddress)
1361+
_exceptionsStack.Pop();
1362+
}
13591363
_currentFrame.LastException = null;
13601364
NextInstruction();
13611365
}

tests/engine-behaviors.os

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,10 @@
5353
ВсеТесты.Добавить("ТестДолжен_ПроверитьПередачуПараметровПоСсылке");
5454
ВсеТесты.Добавить("ТестДолжен_ПроверитьСравнениеНаБольшеМеньше");
5555

56+
ВсеТесты.Добавить("ТестДолжен_ПроверитьВложенныеИсключения");
57+
ВсеТесты.Добавить("ТестДолжен_ПроверитьВложенныеИсключенияДелегат");
58+
ВсеТесты.Добавить("ТестДолжен_ПроверитьВложенныеИсключенияФоновоеЗадание");
59+
5660
Возврат ВсеТесты;
5761

5862
КонецФункции
@@ -243,7 +247,7 @@
243247
Попытка
244248
ПроброситьИсключение();
245249
Исключение
246-
юТест.ПроверитьИстину(ПустаяСтрока(ИнформацияОбОшибке().Описание), "Текст исключения должен быть пустым");
250+
юТест.ПроверитьРавенство("", ИнформацияОбОшибке().Описание, "Текст исключения должен быть пустым");
247251
КонецПопытки;
248252

249253
КонецПроцедуры
@@ -691,3 +695,47 @@
691695
Ошибка, "Для одинаковых объектов" );
692696

693697
КонецПроцедуры
698+
699+
Процедура ТестДолжен_ПроверитьВложенныеИсключения() Экспорт
700+
ИсключениеВоВложеннойПопытке();
701+
КонецПроцедуры
702+
703+
Процедура ТестДолжен_ПроверитьВложенныеИсключенияДелегат() Экспорт
704+
Действие = Новый Действие(ЭтотОбъект, "ИсключениеВоВложеннойПопытке");
705+
Действие.Выполнить();
706+
КонецПроцедуры
707+
708+
Процедура ТестДолжен_ПроверитьВложенныеИсключенияФоновоеЗадание() Экспорт
709+
710+
ФоновоеЗадание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ИсключениеВоВложеннойПопытке");
711+
ФоновоеЗадание.ОжидатьЗавершения();
712+
713+
Если ФоновоеЗадание.ИнформацияОбОшибке <> Неопределено Тогда
714+
715+
ВызватьИсключение СтрШаблон(
716+
"%1 (%2:%3)",
717+
ФоновоеЗадание.ИнформацияОбОшибке.Описание,
718+
ФоновоеЗадание.ИнформацияОбОшибке.ИмяМодуля,
719+
ФоновоеЗадание.ИнформацияОбОшибке.НомерСтроки
720+
);
721+
722+
КонецЕсли;
723+
724+
КонецПроцедуры
725+
726+
Процедура ИсключениеВоВложеннойПопытке() Экспорт
727+
728+
Попытка
729+
730+
Попытка
731+
ВызватьИсключение "Исключение из вложенной попытки должна перехватываться";
732+
Исключение
733+
КонецПопытки;
734+
735+
ВызватьИсключение "Исключение из внешней попытки должна перехватываться";
736+
737+
Исключение
738+
// Успех
739+
КонецПопытки;
740+
741+
КонецПроцедуры

0 commit comments

Comments
 (0)