S-JIS[2009-01-24] 変更履歴

BuildExceptionクラス

Antの自作タスクで例外を扱うクラス。

BuildExceptionはRuntimeExceptionから派生しているので明示的にthrowsを宣言する必要は無いのだが、Task#execute()等では明示的に宣言されている。


スローの仕方

単純にメッセージを書くには、Stringのみを引数に持つコンストラクターを使えばよい。
また、他の例外をラップすることも出来る。

import org.apache.tools.ant.BuildException;
		throw new BuildException("メッセージ");
		throw new BuildException(e);
		throw new BuildException("メッセージ", e);

すると、以下のようにメッセージが表示される。

BUILD FAILED
build.xml:218: メッセージ

build.xmlのファイル名の直後の数字は、行番号。例外が出たタスクのある行が示される。


DataTypeを継承したクラスの中で例外を発生させたい場合は、ロケーションも指定してやる方がいい。

public class HogeType extends DataType {

	public void 呼ばれるメソッド() throws BuildException {

		throw new BuildException("メッセージ", getLocation());
		throw new BuildException(e, getLocation());
		throw new BuildException("メッセージ", e, getLocation());
	}
}

Locationは、TaskDataTypeがbuild.xmlファイル上のどの行で書かれたかを示すクラス。
BuildExceptionにロケーションを指定しないと、Antが自動的にbuild.xml上のタスクの開始行をセットしてくれる。
しかしDataTypeの場合はその位置とは離れた場所に書かれていることが多いので、ちょっと分かりにくくなってしまう。
(特に複数のDataTypeをタスク内に指定していた場合にどのDataTypeか分かりにくくなる)

DataType#getLocation()で位置を取得できるので、BuildExceptionに渡すことが出来る。


メッセージ内容

属性やボディー部に書かれた要素の精査エラー時のメッセージはどう書けばよいか。
は、タスク設計ガイドラインに書かれている“属性名の一貫性の無さ”と同様に、統一されていない(苦笑)

使用ケース メッセージ 使用クラス
必須の属性が指定されていない場合 属性名 attribute must be set! FixCRLF
Javac
属性名 attribute is required Mkdir
Ear
no 属性名 specified ExecTask
どちらかの属性が必須なのに
どちらも指定されていない場合
One of 属性名1 or 属性名2 must be set. Copy
属性を1つしか書けないのに
両方指定されている場合
Only one of 属性名1 and 属性名2 may be set. Copy
属性名1 and 属性名2 are mutually exclusive FixCRLF
必須の要素が指定されていない場合 You must nest a 要素名 into <自分の要素名> Not
要素を1つしか書けないのに
2つ以上書いた場合
Cannot define more than one 要素名 Copy
You must not nest more than one 要素名 into <自分の要素名> Not
cannot have > 1 nested <要素名>s ExecTask
属性か要素のどれかが必須なのに
何も指定されていない場合
At least one of the 属性名1 or 属性名2 attributes,
 or a nested resource collection,
 must be set.
Delete

独自タスクの作り方へ戻る / Ant目次へ戻る / 技術メモへ戻る
メールの送信先:ひしだま