PowerBuilder аварийно завершает работу в режиме отладки из-за ошибок внутри блоков try/catch

В режиме отладки powerbuilder (версия 10.5) выдает ошибку выполнения приложения и завершает приложение из-за ошибок, вызванных операторами, помещенными в блоки try/catch?

Например, строка 3 ниже выдает ошибку «превышена граница массива», и приложение завершается. Как я могу преодолеть эту (обработанную) ошибку и отладить остальную часть кода?

try
// lstr_passed_values = message.powerobjectparm
 ls_symv_no = gstr_symv_passed_values.is_values[1]
 if isnull(ls_symv_no) or ls_symv_no = "" then
  is_symv_no="%"
 else
  is_symv_no = ls_symv_no
  gstr_symv_passed_values.is_values[1]=""
 end if
catch (throwable err)
 is_symv_no="%"
end try

person George Dontas    schedule 11.02.2010    source источник
comment
Вы пытались проверить длину массива перед доступом к его элементам?   -  person ilitirit    schedule 11.02.2010
comment
Да, это решило бы проблему, но для чего нужен блок try/catch. Во время выполнения код ведет себя нормально, как и ожидалось, но в режиме отладки он ведет себя так, как будто операторы try/catch игнорируются!   -  person George Dontas    schedule 11.02.2010
comment
После некоторых исследований кажется, что это известная проблема, и я не уверен, что существует общий обходной путь (кроме использования окон сообщений во время выполнения). groups.google.co.za/group/   -  person ilitirit    schedule 11.02.2010


Ответы (2)


Борьба с отладкой?

Я бы сказал, что отладчик PB ведет себя так, как должен. Если вы пытаетесь по-настоящему понять концепцию отладки, предполагается, что вы будете выполнять код построчно. Выдав вам ошибку «Превышена граница массива», отладчик фактически доказал, что в вашем коде есть потенциальное необработанное исключение (именно поэтому вы поместили туда код Try-Catch).

Не предполагается выбрасывать исключение до тех пор, пока отладчик не достигнет этой точки. Это противоречит цели отладчика. Вы понимаете, что я имею в виду?

Теперь, если вы хотите пропустить определенный блок кода в режиме отладки, вам нужно использовать «Установить следующий оператор».

Из вашего модифицированного примера кода ниже установите точку останова в строке 1. Как только отладчик достигнет точки останова, щелкните правой кнопкой мыши «Редактировать переменную» строку «is_symv_no». Затем переместите курсор на строку 14 и нажмите «Установить следующий оператор». Это обойдет всю подпрограмму try-catch (строки 2-13) и позволит вашей программе продолжить работу.

1   ls_symv_no = ""
2   try 
3       // lstr_passed_values = message.powerobjectparm 
4       ls_symv_no = gstr_symv_passed_values.is_values[1] 
5       if isnull(ls_symv_no) or ls_symv_no = "" then 
6           is_symv_no="%" 
7       else 
8           is_symv_no = ls_symv_no 
9           gstr_symv_passed_values.is_values[1]="" 
10      end if 
11  catch (throwable err) 
12      is_symv_no="%" 
13  end try 
14  return
person counterflow    schedule 11.02.2010

В случае, если кто-то наткнется на эту ветку - если нажатие на "Игнорировать" не приведет вас к блоку TRY...CATCH во время отладки, то, чтобы избежать сбоя, перейдите к Отладка...Исключения в отладчике PB. Выберите вариант «Продолжить» для соответствующего типа исключения.

person F3.    schedule 25.10.2011
comment
PB 10.5.2, похоже, не предоставляет такой возможности. - person George Dontas; 26.10.2011