Выход из цикла for через try/ catch

#java

#java

Вопрос:

ниже приведена часть моего кода

 if(search_result.contains(num_per_page_str)) { // if  num item per page is => 24,
   for(int item = 1 ; item <= num_per_page_int ; item   ) { //interate over the current page 
      Thread.sleep(3000);
      try {//if display vertical   horizontal
         WebElement url = driver.findElement(By.linkText(item_desc)); // get the URL via element
         String item_URL = url.getAttribute("href"); 
         System.out.println("Item URL = "    item_URL); 
         getPrice(driver, item_URL);                        
      } //try
      catch (Exception e) { //if display vertical only
         WebElement url = driver.findElement(By.linkText(item_desc)); // get the URL via element
         String item_URL = url.getAttribute("href");
         System.out.println("Item URL = "    item_URL);
         getPrice(driver, item_URL);                        
      } //catch
   } // for int item = 1                
} //if search result
else { //if items per page < 24         
}//else
 

После достижения ветки try / catch getPrice(driver, item_URL); я ожидаю, что она вызовет функцию getPrice вместе с аргументами.

Однако то, что я получаю сейчас, заключается в том, что при выполнении вызова функции getPrice() она не выходит из цикла for и повторяет цикл.

Я делаю что-то не так в своем коде, что блокирует выход из цикла for? Спасибо

Комментарии:

1. Вы можете переместить try-catch таким образом, чтобы он обтекал цикл. Затем, при выходе из catch блока, он будет снаружи. try { for (...) { ... } } catch (...) { ... } . Конечно, у вас больше не будет item_URL then. Вы также можете просто использовать break; для выхода из цикла.

2. использовать break инструкцию

3. @Zabuzard Спасибо за совет. Просто интересно, есть ли какие-либо проблемы в моем кодировании, чтобы я мог избежать этого в будущем?

4. @B.M Это кажется хорошим способом. Я попробую это сделать и проинформирую вас.

5. Это только я или try и catch блоки точно такие же? Какова логика, стоящая за этим? Если try блок выйдет из строя, то catch тоже выйдет из строя, нет?

Ответ №1:

Добавьте перерыв после вызова getPrive, например:

     for(int item = 1 ; item <= num_per_page_int ; item   ) { //interate over the current page 
      Thread.sleep(3000);
      try {//if display vertical   horizontal
         WebElement url = driver.findElement(By.linkText(item_desc)); // get the URL via element
         String item_URL = url.getAttribute("href"); 
         System.out.println("Item URL = "    item_URL); 
         getPrice(driver, item_URL); 
         break;
                   
      } //try
      catch (Exception e) { //if display vertical only
         WebElement url = driver.findElement(By.linkText(item_desc)); // get the URL via element
         String item_URL = url.getAttribute("href");
         System.out.println("Item URL = "    item_URL);
         getPrice(driver, item_URL);
         break;                        
      } //catch

   } // for int item = 1 
 

Комментарии:

1. при finally { break; } этом он всегда будет прерываться, даже если ошибки вообще не было. Это означает, что цикл устарел, поскольку он всегда будет выполнять только одну итерацию. Вместо этого переместите break в catch блок.

2. @Linh, мои пологии. Возможно, я упускаю некоторую информацию из своих вопросов. Что мне нужно сделать, так это то, что как только я достигну функции getPrice(), мне нужно выйти из цикла for, перейти к getPrice(), чтобы продолжить выполнение некоторой задачи, а затем вернуться обратно в цикл for . Но спасибо и за ваш совет.

3. Насколько я понимаю, автор хочет выйти из цикла после выполнения getPrice в блоке try{}

4. @LinhNguyen Правильно. Но ваш код этого не делает. finally выполняется всегда. В обоих случаях catch был введен if, но также не был введен if catch.

5. Вы правы. break; должен добавляться сразу после каждого getPrice()