2013-04-28 19 views
0

我實現了一個簡單的自然語言解析器我的Grails應用程序的一部分,以實現一個命令行界面,用戶可以輸入諸如「創建新用戶」,應用程序將執行命令處理這個任務等,我已經創建的文件,如:錯誤的src/Groovy類

Tokenizer.groovy 
PartOfSpeechTagger.groovy 
SyntacticAnalyser.groovy 
SemanticAnalyser.groovy 
CommandGenerator.groovy 

由此這些被放置在src/groovy

在我的控制器,我有一個run()方法實例化這些解析器類,並調用這些對象中的方法,像這樣:

def run() 
    {  
     def tokenizer = new Tokenizer() 
     def posTagger = new PartOfSpeechTagger() 
     def syntacticAnalyser = new SyntacticAnalyser() 
     def semanticAnalyser = new SemanticAnalyser() 
     def commandGenerator = new CommandGenerator() 

     //split command string into tokens 
     def words = tokenizer.getTokens(params.command) 
      def taggedWords = posTagger.tagWords(words) 
      ... and so on 
    } 

我的問題是我希望能夠到錯誤信息發送回這些解析器類中出現的客戶端,例如,在Tokenizer如果無效Token發現等

什麼是最好的辦法,我處理這些錯誤,並將它們發回給瀏覽器?

我有錯誤,在這種級別的處理沒有以往的經驗,所以任何輸入歡迎。

最初我曾想過拋出一個自定義的InvalidTokenException並將其捕獲到控制器中,並將文本呈現給客戶端,但這看起來不正確?!

有什麼想法?

回答

1

您可以throw自定義異常到控制器,並使用render

//You can use whichever contentType you need, here I have mentioned json 
render (status: HttpStatus.NOT_FOUND.value(), contentType: "application/json" text: exception.getMessage()) 

還有一個觀察我認爲我應該分享。所有這一切你src/groovy添加分析器工具類的是好的,但你會與n數每個實例的結束爲n數從Controller電話。例如,來自控制器的單個呼叫將最終創建實用程序類的5個實例(Tokenizer, PartOfSpeechTagger, SyntacticAnalyser, SemanticAnalyser, CommandGenerator)。

爲了優化上面的實現,你可以service類各個電力公司。由於service類缺省爲Singleton。每個服務器只會創建一個實例。因此,您最終將在整個應用程序中使用5個實用程序服務實例。

或明確指定實用工具類Singleton。

只是這可能是對你感興趣的想法。

+0

是的,這是有益的感謝,沒有併發問題,我認爲? – 2013-04-28 16:59:44

+0

不,只要你在處理局部範圍內的東西的方法。在服務中使用全局範圍並不代表我會分享的建議。 – dmahapatro 2013-04-29 03:38:26