Неожиданное переопределение поведения getWorkbenchErrorHandler в Eclipse RCP - PullRequest
0 голосов
/ 31 января 2012

Мне кажется, я обнаружил в своем коде проблему с котом Шредингера. Тело функции никогда не выполняется, если я изменяю одну строку в теле той же функции; но если я оставлю эту строку в покое, функция будет выполнена. Каким-то образом программа заранее знает, что такое тело, и решает не называть его ...

Я работаю над приложением Eclipse RCP на Java, и мне нужно использовать их Система обработки ошибок . По ссылке на странице,

Существует два способа добавления обработчиков в поток обработки.

  • с использованием точки расширения org.eclipse.ui.statusHandlers
  • консультантом рабочей среды и его методом {@link WorkbenchAdvisor # getWorkbenchErrorHandler ()}.

Итак, я пошел в свой ApplicationWorkbenchAdvisor класс и переопределил getWorkbenchErrorHandler метод:

@Override
public synchronized AbstractStatusHandler getWorkbenchErrorHandler()
{
    System.out.println("IT LIVES!");

    if (myErrorHandler == null)
    {
        AbstractStatusHandler delegate = super.getWorkbenchErrorHandler();
        MyStatusHandler otherThing = new MyStatusHandler(delegate);
        myErrorHandler = otherThing;
    }
    return myErrorHandler;
}

MyStatusHandler предназначен для использования в качестве обработчика delegate. Я переименовал класс для анонимности. Как и прежде, эта функция никогда не вызывается. Печать никогда не происходит, и даже в режиме отладки с точками останова они никогда не срабатывают. Теперь странная часть: если я изменю строку, которая присваивает myErrorHandler на

myErrorHandler = delegate;

тогда вызывается функция ; фактически несколько раз!

Эта проблема поставила меня в тупик и двух опытных коллег по java, поэтому я надеюсь, что хорошие люди из SO могут помочь нам!

1 Ответ

0 голосов
/ 31 января 2012

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

...