2015-10-23 3 views
0

Моя проблема такая же, как у this thread: «Я хочу настроить собственный обработчик ошибок, который вызывается каждый раз, когда возникает непредвиденная ошибка. Как я могу это достичь?»Обработка глобальной ошибки Eclipse E4 RCP

Как это сделать в E4? В Е3 это может быть достигнуто путем переопределения метода eventLoopException из ApplicationWorkbenchAdvisor

нить ссылки на another thread, где StatusReporter расширяется. Теперь я могу расширить StatusReporter, но его методы не запускаются автоматически при возникновении какого-либо неожиданного исключения. Также я получаю предупреждение о том, что StatusReporter не является API.

Another approach, как указано в вики, предназначено для использования StatusHandler. Но я не хочу ссылаться на StatusHandler вручную. Я хочу, чтобы глобальный обработчик автоматически собирал исключения без обработки ...

Любая помощь была бы принята с благодарностью.

Спасибо, Жеан

ответ

1

Вы можете поставить свою собственную реализацию IEventLoopAdvisor и контекста. Метод @PostContextCreate вашего класса LifeCycle - хорошее место, чтобы добавить это.

IEventLoopAdvisor имеет два метода:

@Override 
public void eventLoopIdle(final Display display) 
{ 
    // Called whenever the RCP is idle, you can do other things here 
    // but it is very important to call 'display.sleep()' 

    display.sleep(); 
} 

@Override 
public void eventLoopException(final Throwable exception) 
{ 
    // Add code for unhandled exceptions 
} 

Примечание: IEventLoopHandler является внутренний класс так обычно следует избегать, но это использование, кажется, санкционирован.

Если вы хотите переопределить ведение журнала всех сообщений, вы можете создать свой собственный класс, полученный из org.eclipse.e4.core.services.log.Logger, и ввести его в контекст Eclipse.

+0

Спасибо за ваш быстрый ответ. Я реализовал «IEventLoopAdvisor» и поместил его в контекст, как вы предложили. Его метод eventLoopIdle() вызывается каркасом, но, к сожалению, метод eventLoopException() не вызывается при необработанных исключениях ... Нужно ли вам делать что-то дополнительное для того, чтобы его называть? –

+0

Нет. Если вызывается eventLoopIdle, это работает. Возможно, исключения, с которыми вы хотите иметь дело, на самом деле обрабатываются где-то. Если появившееся сообщение не говорит «Внутренняя ошибка xxxxx», это не происходит из события eventLoopException по умолчанию. –

+0

Я бросаю манекен 'IllegalArgumentException' из метода' @ Persist' моей 'Part', просто чтобы проверить это. Возможно, это не действительный тестовый пример ... Как я могу проверить, работает ли он? –

Смежные вопросы