コントローラー / Core

例外

例外リスナ

StartdashBundle での例外処理は、SdExceptionListener にてハンドリングされます。

通常処理

特に設定なしで動作させたり、開発モード(app_dev.php)動作1)の場合、Symfony2標準の ExceptionListener と同じ動作になります。
※ extends し、parent をコールしています。

例外処理を振り分け

設定にて例外クラスに例外レベルを指定することで、3段階の例外処理を振り分けて実施します。

StartdashBundle標準のものは以下のように登録されています。

tinyworld_startdash.sdexceptions:
    TinyWorld\StartdashBundle\Core\Exception\SdException: 'interrupt'
    TinyWorld\StartdashBundle\Core\Exception\SdInterruptException: 'interrupt'
    TinyWorld\StartdashBundle\Core\Exception\SdRestartException: 'restart'
    TinyWorld\StartdashBundle\Core\Exception\SdRetryException: 'retry'
    Symfony\Component\HttpKernel\Exception\NotFoundHttpException: 'interrupt'

例外クラス(後述)毎に、例外レベルを指定しています。

例外レベル毎に、以下の動作を行います。

  • 中断例外(interrupt)
    操作不可の例外画面が表示され、全ての処理を中断させます。
    何かを行いたい場合、URL指定しての接続からの実施が必要になります。
    特に何もしなければこの動作になります。
  • 再開可能例外(restart)
    フレームありの例外画面が表示されます。
    フレームのリンクから操作を再開することができます。
  • 継続可能例外(retry)
    POST時のみ動作し、refererにリダイレクトし、フレッシュメッセージでエラー表示されます。
    当該動作は中断されますが、その他画面操作を継続することができます。
    GET時に指定しても 再開可能例外 として動作します(リダイレクトループ予防です)

中断例外(interrupt)時には、デフォルトテンプレート2)内容をフレーム無効化して表示します。
再開可能例外(restart)や継続可能例外(retry)のGETリクエスト時には、同テンプレート3)内容をフレーム有効化して表示します。

自動詳細テンプレート利用

使用するテンプレートは、ステータスコード専用、ステータスグループ用のテンプレートファイルがあれば、それを自動利用する。

ファイル名部末尾に _### 形式でステータスコードを付与したものを使用する。

それがない場合、 _#00 形式でステータスグループを付与したものを使用し、それもない場合はテンプレートファイルそのものを使用する。

例外時表示内容

例外時表示テンプレートには、SdC(sdc)、例外レベル(exceptiontype)、例外そのもの(exception) の他、以下の情報が引き継がれる。

  • HTTPステータスコード(statusCode)
    例外クラスが保持している(getStatusCode()で取得できる)場合はそれを用い、そうでなければ 500 を引き渡す。
  • HTTPステータワード(statusWord)
    ステータスコードに対し、内容を示すワードを引き渡す。
    例外クラスが保持している(getStatusWord()で取得できる)場合はそれを用い、そうでなければデフォルトのワード(SdException::statusWord(HTTPステータスコード)取得結果)を引き渡す。
  • メッセージ(message)
    例外クラスが表示用メッセージ(getDisplayMessage()で取得できる)を保持している場合はそれを用い、そうでなければメッセージ(getMessage()で取得できる)を用いる。
    ともにない場合は空文字を引き継ぐ。
    ※ 通常と表示用を分ける事で、画面表示とログ出力内容を分けることが出来る。

例外後処理

例外クラスに postAction というメソッドがあればそれを実行します(後述)

その例外特化の処理(特殊なログを出力したり、メールを送信したり)が必要であれば該当メソッドを実装すれば自動で実施します。

通常は何も行いません。

例外クラス

通常の例外クラスも設定にて指定することで本例外処理に組み込む事ができる。

SdException

本例外処理用の基本クラスで、基幹クラスとして使用することができる。

  • 例外開発フラグ
    setDev() をコールすることで例外開発フラグを立てることができ、開発モード(app_dev.php)動作時でも該当例外クラス処理を実施させることができる。
  • テンプレートファイル
    setTemplateFile( テンプレートファイルパス ) にて設定することで、該当例外クラス専用のテンプレートファイルを指定することができる。
  • HTTPステータスコード
    HttpExceptionを継承しており、コンストラクタにて HTTPステータスコード を指定することができる。
    デフォルトは 500。
  • HTTPステータワード
    デフォルトの HTTPステータスコード対応ワードマップを保持しており、それを返却する処理の他、マップを書き換えたり追加する機能も提供する。
  • 表示用メッセージ
    HTTPステータスコード(200, 400)により、メッセージをそのまま応答するか、HTTPステータスコードに対応した固定メッセージを応答する。
  • メッセージ
    HttpExceptionを継承しており、コンストラクタにて メッセージ を指定することができる。
  • ログ出力
    例外をログに出力する機能を提供する(デフォルト状態では出力しない)

SdInterruptException、SdRestartException、SdRetryException は各例外レベルに対する実装で、postAction() でログ出力を実行している他は特別な処理は行っていない。


20181221

1)
例外開発モード時を除く:後述
2) , 3)
テンプレートを指定したい場合は専用の例外クラスを作成・登録します:後述
  • コントローラー/core/例外.txt
  • 最終更新: 2021/09/21 19:04
  • (外部編集)