Зачем пытаться / ловить вокруг броска? - PullRequest
0 голосов
/ 13 мая 2011

При попытке выполнить рефакторинг кода, который я написал, я попытался сгенерировать исключение в предложении catch, например:

try {
....
}
catch(Exception exception){
.....
throw exception
}

Однако, когда я попытался выбросить исключение в строке «throw исключение», компилятор пожаловался с сообщением, что мне нужно заключить мое предложение throw в новый try / catch следующим образом -

try
{
  ....
}
catch (Exception exception)
{
  .....
  try
  {
    throw exception
  }
  catch (Exception e2)
  {
     ...
  }
}

Почему компилятор требует этого и для чего он нужен?

Спасибо

Ответы [ 4 ]

3 голосов
/ 13 мая 2011

Исключение java.lang.Exception является проверенным исключением.Это означает, что он должен быть либо объявлен в предложении throws включающего метода, либо перехвачен и обработан в теле метода.

Однако в вашей «фиксированной» версии вы перехватываете исключение, отбросить его и сразу же поймать снова.Это не имеет особого смысла.

Не видя реального кода, не ясно, каким должно быть реальное решение, но я ожидаю, что проблема в оригинальном обработчике try { ... } catch:

  • Если возможно, вы должны поймать более конкретное исключение в этой точке, чтобы при его повторном отбрасывании оно охватывалось существующим списком throws метода.

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

  • В качестве крайней меры вы можете изменить сигнатуру метода, включив в нее Exceptionсписок бросков.Но это действительно плохая идея, потому что она просто выдвигает проблему вызывающей стороне ... и оставляет разработчика / читателя в состоянии не знать, какие исключения ожидать.

1 голос
/ 13 мая 2011

В Java существует различие между проверенными и непроверенными исключениями.Непроверенное исключение может, по сути, генерироваться в любом месте кода, и, если оно где-то не перехватывается, оно будет распространяться до точки входа вашего приложения, а затем останавливать процесс (обычно с сообщением об ошибке и трассировкой стека).Проверенное исключение отличается: компилятор не позволит вам просто позволить ему распространяться, вам нужно либо окружить любой код, который может вызвать проверенное исключение, с помощью блоков try-catch (и «throw exception» - самый простой случай, если исключение являетсяэкземпляра класса проверенных исключений) или вы должны пометить метод, который содержит вызов кода, который может генерировать проверенное исключение, с помощью объявления throws.Если желаемым поведением является генерирование неконтролируемого исключения, то вам нужно заключить исключение в RuntimeException.Если вы хотите, чтобы исключение было проверено, вам нужно добавить объявление throws в ваш текущий метод.

1 голос
/ 13 мая 2011

В вашем исходном коде ничто не ловит выброшенное исключение. Я полагаю, что вы должны либо указать, что ваша функция генерирует исключение, либо иметь другой блок try / catch, как это рекомендует компилятор.

Вместо

public void yourFunction(){
  try {
    ....
  }
  catch(Exception exception){
    .....
    throw exception
  }
}

попробовать

public void yourFunction() throws Exception{
  try {
    ....
  }
  catch(Exception exception){
    .....
    throw exception
  } 
}
0 голосов
/ 13 мая 2011

Я предполагаю, что вы пытаетесь выбросить подкласс исключения, который не объявлен методом как тип исключения, который он может выбросить.

Следующий пример работает

package test.example;

public class ExceptionTest {

    public static void main(String[] args) throws Exception{
        try {
            int value = 1/0;
        } catch (Exception e) {
            System.out.println("woops the world is going to end");
            throw e;
        }

    }

}

Однако этот пример выдаст ошибку.

package test.example;

public class ExceptionTest {

    public static void main(String[] args) throws RuntimeException{
        try {
            int value = 1/0;
        } catch (Exception e) {
            System.out.println("woops the world is going to end");
            throw e;
        }

    }

}

Обратите внимание, что во втором примере я просто ловлю Exception, а не RuntimeException, он не скомпилируется, так как я генерирую Exception, который является необъявленным броском, даже если я делаю это.объявляет RuntimeException.

Да, исключение - RuntimeException, но компилятор этого не знает.

Просто подумал о третьем рабочем примере, чтобы показать вам.Этот также работает, потому что вы бросаете тот же тип, что и вы объявляете.(обратите внимание, что единственным изменением является блок catch)

package test.example;

public class ExceptionTest {

    public static void main(String[] args) throws RuntimeException{
        try {
            int value = 1/0;
        } catch (RuntimeException e) {
            System.out.println("woops the world is going to end");
            throw e;
        }

    }

}

Вам необходимо понять различия между всеми этими тремя ответами

...