• 締切済み

例外が発生した時にブラウザにメッセージを表示

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ブロックの中にはどのように、記述したらいいのでしょうか? ひとつのクラス内で以上の事がしたいのですが、そもそもそれも 無理なのでしょうか?

みんなの回答

  • ssr-y6
  • ベストアンサー率71% (5/7)
回答No.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>"); }; }; }

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> catchブロック内で、いままでのPrintWriterを無効にする事は > 不可能なんでしょうか? 既に出力されちゃった内容ですからね。 そこまできれいにやりたければ、出力内容は文字列に貯め(StringWriterを使っても良い)て、 最後(例えば、finallyブロック)にまとめて出力する、なんて方法もあります。

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

スタックトレースをブラウザに表示したいということでしょうか? Exception クラスがもつ printStackTrace() は三種類の引数指定ができます。 そのうちのひとつは PrintWriter クラスを受け付けるので、   catch(Exception e){     PrintWriter pw = response.getWriter();      ...     e.printStackTrace(pw);      ...   } というような使い方が可能です。タグを省略してますが、必要なものは前後で出力してください。

feb2
質問者

お礼

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

関連するQ&A