Java: Как создать исключение для вызывающего метода внутри тела try catch? - PullRequest
5 голосов
/ 02 октября 2010

Когда у меня есть метод, подобный этому:

public static void foo(String param) throws IOException
{
    try
    {
         // some IOoperations
         if (param.isEmpty())
         {
              throw new IOException("param is empty");
         }
         // some other IOoperations

    } catch (Exception e) {
        /* handle some possible errors of of the IOoperations */
    }
}

И когда IOException ("param is empty") выбрасывается, оно перехватывается try-catch в этом теле.Но это исключение предназначено для вызывающего этого метода.Как я могу сделать это правильно?Есть ли что-то «чистое Java» для этого или мне нужно создать исключение другого типа, которое не является экземпляром IOException, чтобы избежать, что тело try-catch с этим справится?

Я знаю, вы быпредлагаем использовать IllegalArgumentException в этом случае.Но это упрощенный пример моей ситуации.На самом деле исключение I - это IOException.

Спасибо

Ответы [ 6 ]

7 голосов
/ 02 октября 2010

Создание собственного подкласса IOException может быть хорошей идеей.Не только для решения этой проблемы, но иногда это немного удобнее для пользователей API.

Тогда вы можете проигнорировать его в блоке catch (немедленно сбросить)

} catch (FooIOException e) {
    throw e;
} catch (Exception e) {
    /* handle some possible errors of of the IOoperations */
}
3 голосов
/ 02 октября 2010

Я думаю, что меня смущает специфика вашего примера - почему вы делаете широкий

} catch (Exception e) {

Если бы этого чрезмерно общего определения catch не было, ваша проблема исчезла бы.

Я неправильно понял?

2 голосов
/ 02 октября 2010

Вы можете поймать его и перебросить, но правильное решение должно быть более избирательным к тому, что вы ловите в своем операторе catch ....

Например.В приведенном ниже коде я ловлю исключение FileNotFoundException, поэтому IOException возвращается в вызывающий метод.

public static void foo(String param) throws IOException {
        try {
         // some IOoperations
         if (param.isEmpty())
         {
              throw new IOException("param is empty");
         }
         // some other IOoperations

        } catch (FileNotFoundException e) {
            /* handle some possible errors of of the IOoperations */
        }
    }
2 голосов
/ 02 октября 2010

Вы можете проверить, является ли ваше исключение экземпляром IOException, и если это так, сбросьте его.

catch( Exception e ) {
  if( e instanceof IOException ) {
    throw (IOException)e;
  }
}
0 голосов
/ 02 октября 2010

Если исключения IOException предназначены для вызывающего абонента foo(), вы можете сделать это:

public static void foo(String param) throws IOException
{
    try
    {
         // some IOoperations
         if (param.isEmpty())
         {
              throw new IOException("param is empty");
         }
         // some other IOoperations

    } catch (IOException e) {
        throw e;
    } catch (Exception e) {
        /* handle some possible errors of of the IOoperations */
    }

}

Если ваше исключение - единственное, которое действительно необходимо перебросить, то создайте новый подтип IOException, назовите его MyException и попытайтесь поймать MyException, чтобы перебросить его.

Любая обработка исключений для покемонов очень уродлива!

0 голосов
/ 02 октября 2010

Я бы создал подкласс IOException.Это позволит вам использовать instanceof проверку и повторный бросок.

И очень мало случаев, когда я использую catch (Exception).Почти всегда лучше ловить определенные исключения.Единственная причина, по которой это не нужно делать, - это когда вы хотите объединить исключения и перебросить (операции отражения являются обычным местом для этого).

...