Перейти к содержимому

Фотография

DelphiScript exceptions handling


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 7

#1 NightSpirit

NightSpirit

    Новый участник

  • Members
  • Pip
  • 29 сообщений


Отправлено 22 ноября 2011 - 16:04

Добрый вечер всем,
Столкнулся с проблемой, что try .. except блок не перехватывает ошибки поиска объектов.

Элементарный пример

function testTryExcept;
begin
  try
    Sys.Process('anyProcessName');
  except
    Log.Message('Process doesn''t exist');
  end;  
end;

function testTryExceptWithEvaluate;
begin
  try
    Evaluate('Sys.Process(''anyProcessName'')');
  except
    Log.Message('Process doesn''t exist');  
  end;
end;

Обе возвращают ошибку 'Process not found', а не сообщение 'Process doesn't exist'

Тестовое окружение:
Win7 x64

TestComplete 8.60.665.7 (DelphiScript)

CurrentProjectProperties/DebugServices:
Use extended debugger: on
Enable events: on / pmNormal
Exceptions: on

../Playback:
Stop on error: off
Stop on warning: off
Stop on win recognition error: off

../Open Applications/Debug Agent:
Enable Debug Agent: on
Advanced exceptions handling: on
Read debug info for linked libs: off

Может быть подскажете какой-то способ проверить екзистенс объекта в дереве не по очереди от процесса к чайлдам с вейтметодами/файнд методами?
Обрабатывать ексепшн, как по мне, самый нормальный способ, но он не работает, зараза.

Сообщение отредактировал NightSpirit: 22 ноября 2011 - 21:11

  • 0

#2 XXX

XXX

    Опытный участник

  • Members
  • PipPipPipPip
  • 284 сообщений
  • ФИО:Денис Викторович
  • Город:Санкт-Петербург


Отправлено 22 ноября 2011 - 18:14

Проверять существование процесса нужно с помощью WaitProcess

http://tctutorial.ru/synch/
  • 0

#3 NightSpirit

NightSpirit

    Новый участник

  • Members
  • Pip
  • 29 сообщений


Отправлено 22 ноября 2011 - 21:08

Проверять существование процесса нужно с помощью WaitProcess

http://tctutorial.ru/synch/

Дело не в правильном ожидании, я привел примеры, которые приводят к ситуации, когда генерируется исключение. Как только появиться в пути Sys.WaitProcess('pName', 0).WaitWindow1('wndHandle1', 0).WaitWindow2('wndHandle2', 0) райсится Runner.Halt на чайлде объекта Window1 и скрипт выходит из рана. Не обрабатывается ексепшн как надо. При этом если сделать ошибку, пропустить точку в пути, то ExceptionMessage содержит корректный ексепшн и обрабатывается except секцией.
Поправил немножко первое сообщение, чтобы из примера понятно было в каком месте проблема.
  • 0

#4 XXX

XXX

    Опытный участник

  • Members
  • PipPipPipPip
  • 284 сообщений
  • ФИО:Денис Викторович
  • Город:Санкт-Петербург


Отправлено 23 ноября 2011 - 10:41


Проверять существование процесса нужно с помощью WaitProcess

http://tctutorial.ru/synch/

Дело не в правильном ожидании, я привел примеры, которые приводят к ситуации, когда генерируется исключение. Как только появиться в пути Sys.WaitProcess('pName', 0).WaitWindow1('wndHandle1', 0).WaitWindow2('wndHandle2', 0) райсится Runner.Halt на чайлде объекта Window1 и скрипт выходит из рана. Не обрабатывается ексепшн как надо. При этом если сделать ошибку, пропустить точку в пути, то ExceptionMessage содержит корректный ексепшн и обрабатывается except секцией.
Поправил немножко первое сообщение, чтобы из примера понятно было в каком месте проблема.



Насколько я знаю такую запись Sys.WaitProcess('pName', 0).WaitWindow1('wndHandle1', 0).WaitWindow2('wndHandle2', 0) и не используют.Wait используют один раз в названии объекта, например, для проверки его существования..
то есть

if (!Sys.WaitProcess("pName",100).Exists)
        Log.Warning("Процесс не найден")
else
        var w = Sys.Process("pName").Window1('wndHandle1').Window2('wndHandle2');

  • 0

#5 XXX

XXX

    Опытный участник

  • Members
  • PipPipPipPip
  • 284 сообщений
  • ФИО:Денис Викторович
  • Город:Санкт-Петербург


Отправлено 23 ноября 2011 - 10:43

Если Sys.WaitProcess('pName', 0) не существует то для него нельзя задать Sys.WaitProcess('pName', 0).WaitWindow1('wndHandle1', 0), иначе будет ошибка
  • 0

#6 NightSpirit

NightSpirit

    Новый участник

  • Members
  • Pip
  • 29 сообщений


Отправлено 23 ноября 2011 - 11:13

... что try .. except блок не перехватывает ошибки поиска объектов...

...Обе возвращают ошибку 'Process not found', а не сообщение 'Process doesn't exist'..


:) в этом и смысл обрабатываемых эксепшнов. Мне нужно моё поведение в случае ошибки, а не остановка выполнения скрипта с ошибкой в логе.
  • 0

#7 XXX

XXX

    Опытный участник

  • Members
  • PipPipPipPip
  • 284 сообщений
  • ФИО:Денис Викторович
  • Город:Санкт-Петербург


Отправлено 23 ноября 2011 - 12:51


... что try .. except блок не перехватывает ошибки поиска объектов...

...Обе возвращают ошибку 'Process not found', а не сообщение 'Process doesn't exist'..


:) в этом и смысл обрабатываемых эксепшнов. Мне нужно моё поведение в случае ошибки, а не остановка выполнения скрипта с ошибкой в логе.


так а тебе никто не мешает добавить в тело if операторы, которые нужны)
я привел лишь пример использования Wait
  • 0

#8 NightSpirit

NightSpirit

    Новый участник

  • Members
  • Pip
  • 29 сообщений


Отправлено 23 ноября 2011 - 14:06

Вопрос был не как получить объект в дереве, а почему не обрабатывается ексепшн :)

Ответ оказался очень простым: В случае отсутствия объекта не райсится ексепшн, а сразу постится ошибка в лог.
  • 0


Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных