Webアプリケーションの操作で画面にシステムエラーが出たけれども、Eclipseのコンソールログにはエラーが表示されていないときの対処法の気づきを忘備録として残します。
結論
今回システムエラーの原因はSQLによるプログラムのバグでした。プログラムのバグは例外処理を行わないため、ログにはエラーとして表示されません。SQLのバグはコンパイルエラーでは確認できないため、一時的に非検査例外(プログラムのバグ)を捕捉するようにcatch命令に指定する例外型をExceptionに書き換えて確認する必要があります。
具体的に説明します。
開発環境
- フロントエンドはHTML/CSS、JavaScript (jQuery)を使用。
- バックエンドはJava、フレームワークにStruts1を使用したアプリケーションです。
- IDEはEclipseを使用。
エラーを特定するために取った手順
エラーを特定するために以下の手順をとりました。
- Eclipseのコンソールでエラーを確認する。
- ブラウザのデベロッパーツールでサーバからのレスポンスを確認する。
- Eclipseのコンソールのログを頼りをデバッグを行う。
- 非検査例外を捕捉するために例外型をExceptionに変更してデバッグを行う。
Eclipseのコンソールでエラーを確認する。
アプリケーションの画面でエラーが表示された時はブラウザ側、サーバ側のどちらかのエラーを疑うわけですが、システムエラー系は基本的にサーバ側を確認するのでEclipseのコンソールを確認します。けれども、コンソールにはエラーログが表示されていなかったので次のブラウザのデベロッパーツールでサーバからのやりとりを確認します。
ブラウザのデベロッパーツールでサーバからのレスポンスを確認する。
デベロッパーツールのネットワークパネルでサーバからのレスポンスを確認します。これで実際にサーバからどういう情報が送られてきているか確認することができます。
以下はデベロッパーツールのサンプルの画像です。(実際のエラー画面ではありません。)実際は Preview と Response にシステムエラーが表示されているのを確認できます。
デベロッパーツールのネットワークパネルには、Webページのネットワーク通信に関する情報を表示し、デバッグやパフォーマンスの最適化に役立つ機能が含まれています
- プレビュータブ:
- 用途: プレビュータブは、リクエストに対するレスポンスの内容を表示します。通常、HTML、JSON、XML、テキストなどのコンテンツが表示されます。
- 利点: プレビュータブを使用すると、レスポンスの本文を簡単に閲覧し、コンテンツが正しくロードされているかどうかを確認できます。特にAPIの応答データを確認する際に便利です。
- レスポンスタブ:
- 用途: レスポンスタブは、HTMLやJavaScriptのソースファイルの情報が表示されます。特にHTMLファイルの場合、そのソースコードが表示され、JavaScriptファイルの場合もそのコードが閲覧できます。
- 利点: レスポンスタブは通常、リクエストに対するサーバーからの実際のコンテンツデータを表示するために使用されます。
デベロッパーツールのネットワークパネルについて詳しくは Inspect network activity に記載されています。
Eclipseのコンソールのログを頼りにデバッグを行う。
サーバからのシステムエラーを表示する画面のソースが返されていたら、想定通りサーバでエラーが起きているのでエラーを特定するために、コンソールのログの最後に出力された情報をもとにエラーが起きていそうな箇所(クラス・メソッド)を絞り込みます。
非検査例外を捕捉するために例外型をExceptionに変更してデバッグを行う。
※ 修正した例外の型をExceptionに変更したら、間違ってコミットしないようにしっかりと修正するようにしましょう。SourceTree を使用している場合は、ファイルの変更がハンク毎に見やすくなっているのでコミット前に確認するようにしましょう。
// 以下のような独自例外を
catch (ProjectUniqueException e)
// ↓検査例外の基底クラスである Exception に変更します。
} catch (Exception e) {
Exception は検査例外の基底クラスで、例外処理が必要な検査例外とプログラムのバグなど実行時にエラーである非検査例外の両方を含みます。以下に例外型のクラス階層について、神田ITスクールより引用します。
引用: https://kanda-it-school-kensyu.com/java-basic-contents/jb_ch08/jb_0803/
まとめ
今回のエラーが生じた原因は開発者が埋め込んだSQLの不具合だったわけですが、配列の範囲外へのアクセスを例外処理しないと同様に、開発者が埋め込んだバグによるエラーはリリース前に修正すべきものなので基本的に例外処理を行いません。
ただし、SQLのバグはコンパイルエラーとしてわかりやすい形のエラーを確認することができません。そのため、エラーが起きたときの対処法として非検査例外(プログラムのバグ)を一時的に捕捉するために、Javaの場合はcatch命令に指定する例外型をExceptionに書き換えて確認するということを覚えておくと良いでしょう。