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は、TaskやDataTypeが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, |
Delete |