ORACLE JAPAN Server Release 6.1

 

  |  

  WebLogic Server ホーム   |     jCOM リファレンス   |   前へ   |   次へ   |   目次   |   索引   |   PDF 版

例外

 

WebLogic jCOM は、COM の例外と Java の例外を透過的にマップします。以下の節では、次のことを見ていきます。

 


COM コンポーネントで発生する例外

Java クライアントが COM コンポーネントのメソッドを呼び出した場合、そのコンポーネントが例外を生成する場合があります。

COM 例外には、エラー番号、ソース、および説明が関連付けられています。

COM コンポーネント内での例外の発生

Visual BASIC では、例外は次のように発生します。

Public Sub errorMethod()
Err.Raise vbObjectError + 1051, "My program", "This is the description"
End Sub

Visual C++ では、例外は次のように発生します。

AfxThrowOleDispatchException(0, "I am sorry Dave, I can't do that...");

Java での例外の捕捉

COM コンポーネントが例外を送出すると、com.bea.jcom.AutomationException のインスタンスが Java クライアントに送出されます。このクラスに関連する javadoc ドキュメントは次のとおりです。

AutomationException クラスは、メソッドを公開し、送出された COM 例外のエラー番号、ソース、および説明を取得します。

import com.bea.jcom.AuthInfo;
import java.net.UnknownHostException;
import java.io.IOException;
public class Example {

public static void main(java.lang.String[] args) throws IOException, UnknownHostException {

vbexcep.Class1 c1 = null;

try {
c1 = new vbexcep.Class1();
c1.errorMethod();
} catch(com.bea.jcom.AutomationException ae) {
System.out.println("Caught: " + ae);
System.out.println("Source: " + ae.getSource());
System.out.println("Description: " + ae.getDescription());
System.out.println("Code: " + ae.getCode());
}
finally {
com.bea.jcom.Cleaner.releaseAll();
}
}
}

この例の実行結果は次のとおりです。


 

AutomationException に代わる IOException の使用

AutomationException クラスを使用しない場合、代わりに java.io.IOException を捕捉できます。AutomationException は IOException から派生するからです。これにより、エラー コード、説明、およびソースにアクセスできないことを犠牲にして、COM 関連クラスに対するコードの依存性を減らすことができます。

 


Java オブジェクトで発生する例外

COM コンポーネントは、WebLogic jCOM を使用して Java オブジェクトのメソッドを呼び出します。

このようなメソッドが例外を生成した場合、WebLogic jCOM はその例外を捕捉し、それを適切な COM 例外に変換します。

たとえば、次の Java コードを見てみます。「method1」メソッドは特に具体的なものではありません。

import java.io.*;
public class Simple {
public static void main(String[] args) throws Exception {

com.bea.jcom.Jvm.register("firstjvm");
Thread.sleep(6000000); // 1 時間の休止
}

public void method1() throws java.io.IOException {
throw new java.io.IOException("A deliberate exception");
}
}
}

Visual Basic クライアント コードは次のとおりです。

Public Sub method1(ByVal p1 As Object)
Set p1 = GetObject("firstjvm:Simple")
On Error GoTo ErrorHandler
p1.method1

ErrorHandler: ' Error-handling routine.
MsgBox Err.Source, vbInformation, "Source"
MsgBox Err.Description, vbInformation, "Description"
MsgBox Str(Err.Number), vbInformation, "Code"

End Sub

Visual BASIC コードは、単にエラー ハンドラを確立し、Java オブジェクトの呼び出しを行います。この例の Java オブジェクトは、Visual BASIC エラー ハンドラによって捕捉される例外を故意に生成します。

このエラー ハンドラは、エラー情報を示す一連のメッセージ ボックスを表示します。

ソース

WebLogic jCOM は、エラーを生成したメソッドのスタック トレースを自動的に [Source] に入力します。


 

説明

WebLogic jCOM は、Exception.getMessage() から返された文字列を自動的に[Description] に入力します。


 

WebLogic jCOM の内部メソッドを示すスタック トレースは削除してあります。

コード

WebLogic jCOM は、自動的にコードを 0x80020009 に設定します。これは「Exception occurred.」用の COM です。


 

独自のソース/説明/コードを指定したい場合

WebLogic jCOM のデフォルトをそのまま使用せずに、エラー情報を明示的に設定したい場合は、com.bea.jcom.AutomationException のインスタンスを送出できます。

上の例の Java コードを次のように変更したとします。

public void method1() throws com.bea.jcom.AutomationException {
long code = 0x80020009;
String source = "The source of the exception";
String description = "A demonstration description";
throw new com.bea.jcom.AutomationException(code, source, description);
}

この場合、以下のメッセージ ボックスが表示され、明示的に設定した情報が示されます。


 

 


例外インターセプト メカニズムの使い方

また、例外が COM クライアントに返されるときに呼び出されるコードを提供するためのフックも用意されています。これを使用すると、例外情報を変更したり、COM クライアントが後で取得できるよう例外オブジェクトを保存したりできます。

COM-to-Java から呼び出されたときに生成された例外をインターセプトするには、次のようにインターセプタを一度登録します。

com.bea.jcom.ExceptionInterceptor interceptor = new YourInterceptor();
com.bea.jcom.AutomationException.setExceptionInterceptor (interceptor);

次のように、ExceptionInterceptor インタフェースを実装するクラスを作成します。

class YourInterceptor implements com.bea.jcom.ExceptionInterceptor {

public com.bea.jcom.AutomationException handleException(Throwable t) {

...

}

}

デフォルト エラーが COM クライアントに返されるようにする場合、ハンドラで null を返します。それ以外の場合、次のような特定のエラーを生成できます。

public com.bea.jcom.AutomationException handleException(Throwable t) {

System.out.println("Intercepting: " + t);
long code = 0x80020009;
String source = "The source of the exception";
String description = "A demonstration description";
return new com.bea.jcom.AutomationException(code, source, description);
}

 

back to top previous page next page