- PR -

Exceptionについて

1
投稿者投稿内容
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2004-12-14 22:00
servletからのエラー発生時どこのクラス・メソッドでエラーが出たかを出力してみたのですが、必ず

CLASS:javax.servlet.http.HttpServlet METHOD:service LINE:853 FILE:HttpServlet.java

になってしまいます。
servlet.doget内でDBに接続するクラス・メソッドを呼び出して、そこでエラーが発生しても
上のメッセージがでます。(そのメソッドはthrow Exceptionしています)

なぜなんでしょう?

StackTraceElement[] elements = pri_exception.getStackTrace()
// エラーをtomcat側に出力
pri_exception.printStackTrace();

// ログ出力
TransLog.outMsg(
" CLASS:" + elements[1].getClassName() +
" METHOD:" + elements[1].getMethodName() +
" LINE:" + elements[1].getLineNumber() +
" FILE:" + elements[1].getFileName()
);

YOU@IT
ぬし
会議室デビュー日: 2002/03/29
投稿数: 284
お住まい・勤務地: 大阪
投稿日時: 2004-12-14 23:33

例外をネストしているからではないでしょうか?
Throwable#getCause()を試してみてください。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-15 00:27
サーブレット内で RuntimeException(またはその子クラス)が発生するとコンテナが ServletException にラップして throw します。
Tomcat なんかは根本原因のスタックトレースを表示してくれないらしいです。getRootCause().printStackTrace() で根本原因を表示できるでしょう。
http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletException.html#getRootCause()

#WebLogic 等の商用製品は自動的に根本原因を表示してくれます
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2004-12-15 22:02
YOU@ITさん
インギさん
アドバイス有難うございます。

私が未熟なため良く理解できなかったのですが
@
doget{
}catch (Exception Exception ){
//↓Null Pointer Excepitonが発生
Exception.getCause().printStackTrace();

A
catchのExceptionをServletExceptionに変えたところ
IOExceptionエラーがキャッチできずコンパイルできませんでした。

お二方がおっしゃることとやっていることが違うのでしょうか?
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-15 23:23
//doget{
↑これどういう構文でしょう?コンパイルできなさそうですが。
どういう場所で発生しているかちょっと説明ではわからないのですが、doGet 内で RuntimeException が発生しているのだと思います。
ServletExceptionの役割とかわからないのであればまず doGet 内で RuntimeException をキャッチしてスタックトレースを表示しましょう。
例外の概念とかがそもそも分からないのであればその手の参考書なりサイトをまず読みましょう。
Kira
ぬし
会議室デビュー日: 2004/10/30
投稿数: 252
投稿日時: 2004-12-16 21:13
インギさん>
doGetは以下のものです。割愛しすぎました。ごめんなさい。
Exceptionに関しては一通り学んだつもりですが、、、。
まだ勉強不足ですね。

public void doGet(HttpServletRequest request, HttpServletResponse response){
try{
---
}catch(Exception pri_Exception){
StackTraceElement[] elements = pri_exception.getStackTrace()
// エラーをtomcat側に出力
pri_exception.printStackTrace();

// ログ出力
TransLog.outMsg(
" CLASS:" + elements[1].getClassName() +
" METHOD:" + elements[1].getMethodName() +
" LINE:" + elements[1].getLineNumber() +
" FILE:" + elements[1].getFileName()
);
}
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-12-16 21:53
で、そのスタックトレースはどうなっているんでしょう?
outMsg でごにょごにょ出力している内容より printStackTrace() の出力結果のほうがよっぽど雄弁です。
繰り返し(3度目)になりますが、Exception が ServletException なのであれば getRootCause().printStackTrace() してみましょう。
1

スキルアップ/キャリアアップ(JOB@IT)