Как выполнить команду после исключения

#java

#java

Вопрос:

У меня есть 2d-массив someArray с некоторыми системными командами. Допустим, у меня есть эти команды —

  • ls
  • lol (недопустимая команда)
  • pwd

вторая команда вызовет IOException , а третья команда не будет выполнена. Как мне убедиться, что последняя команда будет выполнена независимо от какого-либо исключения? Любой совет?

               for ( int i = 0; i < someArray.length; i   ) {
                 try{
                    ProcessBuilder pb = new ProcessBuilder(someArray[index]);
                    pb.redirectErrorStream(true);
                    Process process = pb.start();

                    InputStream is = process.getInputStream();
                    InputStreamReader isr = new InputStreamReader(is);
                    BufferedReader br = new BufferedReader(isr);

                    String line;
                    while ( (line = br.readLine()) != null) {
                        System.out.println(line);
                    }
                    br.close();
                }catch(IOException e){
                    System.err.println( "Command not found" );
                }
             }
  

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

1. Используйте finally после блока catch.

2. пожалуйста, покажите полный код, включая ваш цикл, хотя команды

3. @ChristopherSchneider как мне начать со следующего индекса?

Ответ №1:

Вместо использования IOException в catch используйте исключение общего класса, которое будет перехватывать любые возникающие исключения

     for ( int i = 0; i < someArray.length; i   ) {
        try{
           ProcessBuilder pb = new ProcessBuilder(someArray[i]);
           pb.redirectErrorStream(true);
           Process process = pb.start();

           InputStream is = process.getInputStream();
           InputStreamReader isr = new InputStreamReader(is);
           BufferedReader br = new BufferedReader(isr);

           String line;
           while ( (line = br.readLine()) != null) {
               System.out.println(line);
           }
           br.close();
       } catch (IOException e) {
           System.err.println( "Command not found" );
       } catch (Exception e) {
           System.err.println("Unexpected Exception caught to continue other commands");
           e.printStackTrace();
       }
    }
  

редактировать: исправлено сообщение о непредвиденной ошибке

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

1. Перехват Exception — плохая практика. Особенно когда вы не уверены, что сообщаете все подробности об исключении. Существует большой риск того, что какое-то неизвестное исключение, которое не должно быть перехвачено здесь, будет перехвачено и замаскировано, чтобы вы не узнали, что пошло не так.

2. Я согласен, но вопрос был явно сформулирован: «Как мне убедиться, что последняя команда будет выполнена независимо от какого-либо исключения». Для меня было достаточно поймать исключение IOException, поскольку это было бы единственное известное исключение, вызванное, когда команда была ошибочной

3. Уважая комментарий о плохой практике.. Если пользователь может передавать что угодно, гарантировано ли, что Process всегда будет / может выдавать IOException ? Что, если у нее есть другое исключение, блокирующее ее продолжение? Просто очищаю..

4. Если IOException это единственное проверенное исключение, которое у вас может быть, вы всегда можете рисковать непроверенным исключением. Такое может быть перехвачено с помощью RuntimeException при желании (так что вам все равно не нужно catch (Exception e) ).