LS2J を使用したエラー処理

LS2J を使用している間に問題が発生した場合、LotusScript® はエラーメッセージを返します。ただし、これらのエラーメッセージは、正確な追加情報がないと誤解される場合があります。

エラーモデル

Java™ のエラーモデルはキャッチアンドスローです。LotusScript のエラーモデルは、ON ERROR ステートメントとエラー処理ブロックです。LotusScript は Java エラーをキャッチすると、これをエラー処理モデルにマッピングします。これで、LotusScript のユーザーは、JavaError クラスを使用して LotusScript のエラーセマンティクスで Java エラーが操作できるようになります。

ユーザーには、JavaError プロパティの前に LotusScript エラーが表示されるはずです。Java が呼び出される前に LotusScript 内でエラーが検出された場合は、JavaError.ErrorMsg と JavaError.StackTrace は空の文字列です。次のコードに注意してください。

Uselsx *javacon

Sub Initialize
	Dim jSession As JavaSession
	Dim cls As JavaClass
	Dim obj As JavaObject
	Dim msg As String
	Dim jError As JavaError
	On Error Goto ErrorHandling
	Set jSession = New JavaSession()
	Set cls = jSession.GetClass("java/lang/Short")
	' This signature would not match any Constructor
	Set obj = cls.CreateObject("(X)V", 1)
	Print obj.toString()
	Exit Sub
ErrorHandling:
	Print Error ' "LS2J Error: Constructor failed to execute"
	Set jError = jSession.getLastJavaError
	Print "Java error: " jError.ErrorMsg ' empty String
	Exit Sub
End Sub

ユーザーが java.lang.Short 型コンストラクタを呼び出そうとしたとします。この場合、正しい呼び出しは、次の Short 型パラメータの署名です。

	Set obj = cls.CreateObject("(S)V", 1)

ところがその代わりにユーザーが次のように呼び出したとします。

	Set obj = cls.CreateObject("(X)V", 1)

「X」はどちらの Java タイプとも一致しないため、Java が呼び出される前に LotusScript からエラーが発生します。次のエラーメッセージだけが、LotusScript エラーに表示されます。

	LS2J Error: Constructor failed to execute

LS2J の LotusScript 部分がエラーを検出できなければ、Java が呼び出されます。また、次のコードで呼び出されたとします。

	Set obj = cls.CreateObject("(I)V", 1)

この署名は、int 型のパラメータのコンストラクタと一致しています。LotusScript ではエラーが検出されないので Java コンストラクタを呼び出そうとしますが、java.lang.Short クラスに int 型パラメータを持つコンストラクタがないために呼び出しは失敗します。LotusScript エラーはまだ次のままです。

	LS2J Error: Constructor failed to execute

しかし Java が呼び出されているため、次の jError.ErrorMsg も表示されます。

	java.lang.NoSuchMethodError: <init>

JavaError オブジェクトが JavaSession から取り出されるときには、最後のエラーと最後の StackTrace が含まれています。

Example code using JavaError
Sub Initialize
	Dim mySession As New JavaSession
	Dim myError As JavaError

	On Error GoTo ErrorHandling
'...
' code here
'....
	Exit Sub
ErrorHandling:
	Set myError = mySession.getLastJavaError

	print Error
	print myError.ErrorMsg
	print myError.StackTrace

End Sub

このコードサンプルで、LotusScript エラー、Java エラー、Java StackTrace が出力されます。

誤解される恐れがある LotusScript エラーの例

例 1:

オブジェクトのインスタンスを作成しようとしたときに、署名または引数の番号が間違っていたとします。

LotusScript のメッセージ:

LS2J: Null JavaObject

Java ErrorMsg のメッセージ:

java.lang.NoSuchMethodError: <init>

例 2:

オブジェクトのインスタンスを作成しようとしたときに、Constructor でエラーが発生したとします。

LotusScript のメッセージ:

LS2J: Null JavaObject

Java StackTrace のメッセージ:

java.lang.ArrayIndexOutOfBoundsException

at myGraph.<init>(コンパイル済みコード)

例 3a:

メソッドを実行しようとしたときに、使用した引数の番号が間違っていたとします。

LotusScript のメッセージ:

LS2J: Parameter mismatch calling Method <Method Name here>

Java ErrorMsg のメッセージ:

LS2J エラー

例 3b:

メソッドを正しい引数で実行したときに、メソッドに間違いがあったとします。

LotusScript のメッセージ:

LS2J: Parameter mismatch calling Method <Method Name here>

Java StackTrace のメッセージ:

java.lang.ArrayIndexOutOfBoundsException: 3

at myGraph.setOrientation(myGraph.java:262)