🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

3回答

2244閲覧

例外処理を使い、エラーの内容をviewに出力させる方法を知りたいです。

kjrk

総合スコア15

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2021/01/16 09:30

前提・実現したいこと

Servletクラス外で例外で処理が止まる際に、止まった原因をviewで出力したいです。

例えば、DB接続をする際に接続できなかった場合に、
catch文で、DB接続ができませんでした。
のようにviewに出力するような処理にしたいです。

Java

1// DB接続 2Connection conn = null; 3try { 4  conn = DriverManager.getConnection(url, user, password); 5} catch (SQLException e) { 6  out.println("DB接続に失敗しました。"); 7}

試したこと

WriteLogicクラスを作成し、

Java

1import java.io.IOException; 2import java.io.PrintWriter; 3 4import javax.servlet.http.HttpServletResponse; 5 6public class WriteLogic { 7 8 /** 9 * viewに文字を出力させるコード 10 * @throws IOException 11 */ 12 public void print(HttpServletResponse response, String text) throws IOException { 13 // 文字列出力用のストリームを出力するためにPrintWriterオブジェクトを取得 14 PrintWriter out = response.getWriter(); 15 out.println(text); 16 } 17}

使いたいクラスでオリジナルクラスWriteLogicのprint()メソッドを呼び出し、
引数にresponseとtextを渡したいのですが、
サーブレットクラスのresponseは、HttpServletResponseクラス、インターフェイスのためインスタンス化できません。

Java

1Connection conn = null; 2try { 3 conn = DriverManager.getConnection(url, user, password); 4} catch (SQLException e) { 5 String text = "DB接続に失敗しました。"; 6 writeLogic.print(response, text); 7}

どうすれば解決につながりますでしょうか?また、どうアプローチすべきでしょうか?

補足情報(FW/ツールのバージョンなど)

VPSを作成し、その中にtomcatをインストールし、
tomcatで動かそうとしています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kozuchi

2021/01/16 10:06

「Servlet クラス外で処理がとまる」というのはどういうことでしょうか? Servlet から呼び出した処理であれば、途中で catch しない限り、 Servlet で例外を catch できるはずですよね? 逆にServlet から呼び出した処理でないなら、HttpServletResponse と対応づけるのは無理(というか無意味)では?
kjrk

2021/01/16 10:13

ServletからDB関連の処理が書かれた、Daoクラスのメソッドを呼び出し、 Daoクラスのメソッド内のcatchで処理が止まるという意味のつもりでした。 そのDaoクラスで例外をcatchする場合にエラーをviewに出力したいです。
guest

回答3

0

とりあえず、サーブレットの処理が起点であれば、サーブレットの持つHttpServletResponseオブジェクト(具体的には doGet() メソッド等のパラメータ)を使うべきでしょう。
セッションと無関係なHttpServletResponseオブジェクトを作っても何もできません。

Servletクラス外で例外で処理が止まる際に、止まった原因をviewで出力したいです。

途中で catch せずに(あるいはなんらかの Exceptionでラップして) doGet() などで catch するのが view で出力するには一番簡単な方法でしょう。

ただ、フレームワークをお使いなら、フレームワークの例外処理に任せる(doGet() などでも catch しない)のが一般的なつくり方だと思います。
まあこれはその例外をエラー(代替条件)と扱うか障害と扱うかという問題でもあります。
その例外が発生しても、ユーザに情報を表示することで、ユースケースのゴールに到達できる運用フローがあるのであれば、doGet() などで catch して、ユーザに情報を表示して対応を求めるという作り方になるかもしれません。

投稿2021/01/16 13:02

kozuchi

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kjrk

2021/01/16 14:02

ありがとうございます。 参考にさせていただきます。
guest

0

対象のメソッドにthrowsにしたうえで、当該ExceptionからExceptionをthrowしてサーブレットクラスでcatchすれば良いのではないでしょうか。
Exception new時に引数を指定すれば任意のメッセージも入れられます。

接続のメソッド

java

1public void connection() throws SQLException { 2 3///中略 4 5 6catch (SQLException e){ 7 throw new SQLException("DB接続に失敗しました。"); 8 return; 9} 10

サーブレットクラス

java

1String error = new String(); 2try { 3 hoge.connection(); 4} catch (SQLException e) { 5 System.out.println(e.getMessage()); 6 error = e.getMessage(); //あとは変数errorをVIEWに渡す 7}

エラーページ用のルーティング作ってそこにリダイレクトかけてもいい気はします。
それか、それ用のException作ってサーブレットの上位(表現があれですが)でキャッチして全部そこに集約するとか。

投稿2021/01/16 09:53

編集2021/01/16 10:09
m.ts10806

総合スコア80875

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kjrk

2021/01/16 14:00

ありがとうございます。 参考にさせていただきます。
m.ts10806

2021/01/16 19:17

「参考にする」だけで本当に解決なのでしょうか。 こちらは「出来るコード」を提示したつもりですが、理解できてないまま「解決」とされたのでしたら、無駄な時間をお互い使ったことになります
kjrk

2021/01/20 05:58

申し訳ございません。 自分が考えていた設計とは違うものの、解答の一つだと思いましたので、 「参考にする」という言葉を使わせていただきました。
guest

0

自己解決

https://www.atmarkit.co.jp/ait/articles/1111/01/news131_3.html
https://www.atmarkit.co.jp/ait/articles/1112/20/news131_2.html
こちらを参考にし、Exceptionクラスの使い方を学習し、解決できました。

投稿2021/01/20 05:58

kjrk

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問