Java Custom throw исключений ведет себя по-разному в разных проектах - PullRequest
0 голосов
/ 06 мая 2010

Я пытаюсь вызвать в моем коде следующее:

 public void checkParticleLightRestriction(Particle parent) throws LightException {
 if ( parent == null ) {
      throw new LightException("quantum-particle-restrict.23", this);
    }

В одном проекте генерируется исключение, и эффект аналогичен вызову «return», в результате чего я возвращаюсь к точке, сразу же следующейгде этот метод был вызван.

Однако в другом проекте меня выбрасывают из текущего пакета и на точку, предшествующую точке, предшествующей этому методу.

Ему нравится, когда меня выгоняют из барабыть депортированным из страны.

Мой вариант - завернуть бросок в попытке / поймать, но мне интересно, почему эта разница в поведении между двумя проектами?

09 мая 2009 Я играл с вашими предложениями, но я до сих пор не решил это.Вызов для выброса пользовательского исключения просто не вызывается в этом конкретном проекте вне зависимости от того, расширяет ли класс Exception RuntimeException или просто Exception.

public class LightException extends Exception {

    ...etc

    public LightException(String errorCode, Object object) {

        super(errorCode == null ? null : errorStrings.getString(errorCode));
        this.errorCode = errorCode;
        this.invalidObject = object;
    }

    public LightException(String errorCode, Object object, Exception exception) {
        this(errorCode, object);
        add(exception);
    }

    ...
}

Любые идеи приветствуются.

Ответы [ 5 ]

2 голосов
/ 06 мая 2010

Не глядя на код, который вызывает этот метод, невозможно сказать, что происходит.

Может быть, в одном проекте исключение ловится, а не в другом проекте? Это может произойти, если LightException является непроверенным исключением.

EDIT:

Вы говорите (в своем первоначальном вопросе), что:

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

Единственный случай, когда это может произойти, - это когда метод, вызывающий checkParticleLightRestriction(), заключен в блок try...catch, такой как:

try {
  checkParticleLightRestriction(particle);
} catch (LightException e) {
  // do something with e
}

// this is the point 'immediately succeeding where this method was called'
0 голосов
/ 09 мая 2010

Я прошу прощения у всех, кто ломал голову над этой проблемой.Я виноват.Это связано с отсутствием ресурсов в цепочке, которые из-за проблемы с URL не были найдены.

Я исправлю это и, надеюсь, все будет решено.

0 голосов
/ 09 мая 2010

Ваш код Exception выглядит нормально.

Проблема, скорее всего, связана с кодом вызова.Кажется, что вызывающий код в обоих проектах делает разные вещи с пойманным LightException.

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

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

Однако в другом проекте я получаю завершение из текущего пакета идо точки, предшествующей точке, предшествующей этому методу.

в этом случае исключение может быть перехвачено, потенциально заключено в RuntimeException, а затем переброшено из блока catch.Это распространит исключение вверх по стеку, а затем будет обработано кодом, который обрабатывает исключения в общем.

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

0 голосов
/ 06 мая 2010

Мой вариант - завернуть бросок в try / catch, но мне интересно, почему эта разница в поведении между двумя проектами?

Нет различий в поведении. Всякий раз, когда выдается исключение, оно будет поймано на «Ближайший» catch, способный его поймать (около того, который определяется расстоянием в трассе стека). Если вы знаете, что и где вы хотите поймать, скажите об этом и сделайте это.

A throw не является простым return утверждением.

Смотри также

  • JLS 11.3 Обработка исключения

    Когда генерируется исключение, управление передается из кода, вызвавшего исключение, в ближайшее динамически включающее предложение catch оператора try, обрабатывающего исключение.

0 голосов
/ 06 мая 2010

Исключения всегда перехватываются первым окружающим блоком try / catch, который соответствует типу создаваемого исключения. Блок try / catch будет совпадать, если он перехватывает исключение того же типа, что и исключение, или один из родительских типов.

Скорее всего, ваши два проекта отличаются тем, какой тип исключения они ловят в блоке, который вызывает метод checkParticleLightRestriction.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...