プロが教えるわが家の防犯対策術!

Servletで、db検索しその結果をブラウザに表示しています。
SQLExceptionや、NULLPointerExceptionが発生した時に、
今は、
catch(Exception e){
e.printStackTrace();
}
としているのでログにエラーを書き出しているだけで、画面にはなにも表示されません。
エラーの時も、PrintWriter pw = response.getWriter();で
pw.println("<HTML><HEAD></HEAD>");
pw.println("<body><h1>");
pw.println("エラー発生!");
pw.println("</h1></body></html>");
というふうにブラウザに出力したいのです。
catchブロックの中にはどのように、記述したらいいのでしょうか?

ひとつのクラス内で以上の事がしたいのですが、そもそもそれも
無理なのでしょうか?

A 回答 (3件)

 表示したいエラーページのHTMLを出力する文をcatch節に設定すればそれが出力されます。


すでに出力してしまっている内容がある場合は、HTTPServletResponse#reset()でそれをクリアできます。
以下の例では、パラメータにresetを付ければエラーページのみが出力され、
resetを付けなければ途中まで書き出された正常なページの下にエラーページがつながって出力されます。

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class exceptionpage extends HttpServlet {

public void doGet(HttpServletRequest req, HttpServletResponse res) {

boolean ResetFlag = false;
PrintWriter PW;
int i[] = new int[10];

try {

if (req.getParameter("reset") != null) ResetFlag = true;

res.setContentType("text/html");
try { PW = res.getWriter(); } catch (Exception ex) { return; };

PW.println("<html><head><title>Valid Page</title></head>");
PW.println("<body>");
PW.println("<h1>ValidData</h1>");

i[10] = 10;

PW.println("</body></html>");

} catch (Exception ex) {

if (ResetFlag) res.reset();

try { PW = res.getWriter(); } catch (Exception exx) { return; };
PW.println("<html><head><title>Error Page</title></head>");
PW.println("<body>");
PW.println("<h1>Error Occurred</h1><br>");
PW.println(ex.toString() + "<br>");
PW.println("</body></html>");

};

};

}
    • good
    • 0

> catchブロック内で、いままでのPrintWriterを無効にする事は


> 不可能なんでしょうか?

既に出力されちゃった内容ですからね。

そこまできれいにやりたければ、出力内容は文字列に貯め(StringWriterを使っても良い)て、
最後(例えば、finallyブロック)にまとめて出力する、なんて方法もあります。
    • good
    • 0

スタックトレースをブラウザに表示したいということでしょうか?



Exception クラスがもつ printStackTrace() は三種類の引数指定ができます。
そのうちのひとつは PrintWriter クラスを受け付けるので、

  catch(Exception e){
    PrintWriter pw = response.getWriter();
     ...
    e.printStackTrace(pw);
     ...
  }

というような使い方が可能です。タグを省略してますが、必要なものは前後で出力してください。
    • good
    • 0
この回答へのお礼

どうもありがとうございました。
うまくいきました。
だた、tryブロック内でpw.printlnでHTMLを編集中に
エラーが発生した場合、その途中までのHTMLと
catchブロック内で作成したHTMLが繋がってしまうので、
ブラウザには、正しい画面もエラー画面も表示されませんでした。
PrintWriterをflushしても、効果がありません。
catchブロック内で、いままでのPrintWriterを無効にする事は
不可能なんでしょうか?

お礼日時:2002/02/28 17:38

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!