Как получить сообщение об ошибке в StringTemplate?

Как я могу получить сообщение об ошибке времени компиляции из StringTemplate в виде строки?

Этот код, например:

STGroup stg = new STGroup('<', '>');
CompiledST compiledTemplate = stg.defineTemplate("receipt", "<an invalid template<>");
if (compiledTemplate == null)
    System.out.println("Template is invalid");

Просто зарегистрирует что-то вроде «invalid стал для меня полной неожиданностью», но я хочу отобразить это сообщение об ошибке в своем пользовательском интерфейсе.

Я могу получить доступ к ErrorManager с помощью stg.errMgr. Я ожидал, что здесь будет такой метод, как getErrors(), но его нет...


person wvdz    schedule 03.12.2014    source источник


Ответы (1)


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

Этот ответ расскажет вам больше о реализации STErrorListener. Пример, который они дают, не компилируется, поскольку они генерируют проверенные исключения из ErrorListener. Возможно, лучшим подходом будет обработка ошибок непосредственно внутри слушателя, или вы можете просто генерировать RuntimeException, чтобы вы могли перехватывать ошибки при вызове stg.defineTemplate(...).

public class MySTErrorListener implements STErrorListener {
...
@Override
public void compileTimeError(STMessage msg) {
    // do something useful here, or throw new RuntimeException(msg.toString())
}
...
}

Если бы вы выдали исключение RuntimeException, вы могли бы перехватить его при определении ST:

stg.setListener(new MySTErrorListener());
try{
    CompiledST compiledTemplate = stg.defineTemplate("receipt", "<an invalid template<>");
} catch (Exception e)
{
    // tell the UI about the error
}
person Andy Stabler    schedule 05.12.2014
comment
Спасибо, это работает. Я все еще думаю, что у них есть странная реализация прослушивателя ошибок по умолчанию (просто проглатывание исключений), но, к счастью, вы действительно можете просто переопределить ее вот так. - person wvdz; 06.12.2014