2014-12-03 7 views
2

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

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

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

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

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

ответ

1

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

This answer рассказывает вам о внедрении 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 
} 
+0

Thx это работает. Я по-прежнему думаю, что у них есть странная стандартная реализация прослушивателя ошибок (просто глотание исключений), но, к счастью, вы действительно можете просто переопределить его так. – wvdz

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