0
numberrange returns [String value]
    :   numberrangesub
        {
        String numberRange = ($numberrangesub.text);
        String [] v = numberRange.split(",");
        if ( Integer.parseInt(v[0].trim()) < Integer.parseInt(v[1].trim())) $value =numberRange;
        else throw new RecognitionException();
        }
    ;

上記の ANTLR コードを遵守してください。これで、のようなユーザーフレンドリーなエラーメッセージをスローしたいと思います"from value should be less than to value in BETWEEN clause"。私はこのように期待していますがRecognitionException("from value should be less than to value in BETWEEN clause");、antlrは上記のように受け入れませんでした.

Antlrによって生成されたJavaクラスを呼び出しているJavaクラス。以下のように扱っています。

try
{
    parser.numberRangeCheck();
}
catch (RecognitionException e)
{
    throw createException("Invalid Business logic syntax at  " + parser.getErrorHeader(e) + ", " + parser.getErrorMessage(e, null), Level.INFO, logger);
}

どんな助けでも感謝します。

4

2 に答える 2

0

テランスが「決定的なANTLRリファレンス」で書いたように、エラーの章の抜粋

英語のみのエラーメッセージの強制を回避し、一般的に可能な限り柔軟にするために、レコグナイザーは文字列メッセージを使用して例外オブジェクトを作成しません。代わりに、エラーを生成するために必要な情報を追跡します。

したがって、RecognitionErrorのコンストラクタにエラーメッセージは提供されません。ただし、レコグナイザーの追加フィールドを定義して、RecognitionError処理時に表示されるユーザーフレンドリーなエラーメッセージを保持することができます。

numberrange returns [String value]
    :   numberrangesub
        {

        String numberRange = ($numberrangesub.text);
        String [] v = numberRange.split(",");
        if ( Integer.parseInt(v[0].trim()) < Integer.parseInt(v[1].trim()))
            $value = numberRange;
        else {
            this.errorMessage = "from value should be less than to value in BETWEEN clause";
            throw new RecognitionException(this.input);
        }

        }
    ;

そして、getErrorMessageメソッドをオーバーライドします。

public String getErrorMessage(RecognitionException e, String[] tokenNames) {
    String msg = this.errorMessage;
    // ...
}

これは、同じ抜粋で説明されている言い換えメカニズムと同様に機能します。

于 2011-05-16T11:17:54.133 に答える
0

RuntimeExceptionカスタム エラー メッセージをスローしないのはなぜですか?

// ...
else throw new RuntimeException("from value should be less than to value in BETWEEN clause");
// ...
于 2010-02-16T09:33:52.777 に答える