質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

87.61%

if文での例外処理をtry catchで書くとどうなるのか。CakePHP

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 8,182

score 176

皆さんお疲れさまです。

rikさん昨日の投稿に回答ありがとうございました。
Cakephpでの例外処理(try catch)の書き方を教えてください

それで、昨日回答して頂いて

         //条件分岐による例外処理
         if ($this->Report->save($data) === false) {
             //エラーメッセージやその後の処理
             throw new BadRequestException('コメントの更新に失敗しました');
         }

こういう風に書くとよい、というのは分かったのですが、

try catchで書く場合にはこれはどう書いたらよいのでしょうか?

try{
    $this->Report->save($data) === false;
}catch(Exception $e){
    throw new BadRequestException('コメントの更新に失敗しました')
}

こうでしょうか?
tryのカッコの中にもっと何か足す必要があるのでしょうか?
PHP:例外
これを見てもよくわかりませんでした。

どなたか教えてください!お願い致します!
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

catchした中でthrowするあたりが微妙というか何がしたいのかわかりません。
通常のExceptionが飛んできた場合BadRequestExceptionとして処理したいという事でしょうか?
そうなるとかなり乱暴な処理だと思うので構造を考え直した方が良いと思います。

    if ( $this->Report->save($data) === false ) throw new BadRequestException('コメントの更新に失敗しました');

こうする事によってBadRequestExceptionを投げてキャッチしてくれます。
throwの前に何か処理を書きたいなら

if ( $this->Report->save($data) === false )
{
    //ここに何か処理
    throw new BadRequestException('コメントの更新に失敗しました');
}
このようにした方が良いと思います。


そもそもステータスコード400番のBadRequestExceptionをここでthrowする意味も全くわかりません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/06 21:19

    回答ありがとうございます。
    本当によくわからずに投稿していました、すみません。
    上記のように書いた場合はもうtry catch文を書く必要はないのでしょうか?
    その文だけでexceptionをthrowしてcatchもしてくれるという認識であっていますか?

    キャンセル

  • 2015/08/06 23:18

    CakePHPがBadRequestExceptionをキャッチしてくれるはずです。
    CakePHPに明るくはないので、Exceptionはキャッチしてくれるかはわかりません。
    たぶんキャッチしないんじゃないかな?
    BadRequestExceptionはExceptionをextendして作成された例外です。

    キャンセル

checkベストアンサー

+1

reportMain()を呼び出してデータ保存を行うとします。

try catch を使用する場合はこの様になります。
private function reportSave($data) {
    if ($this->Report->save($data) === false) {
        throw new Exception('コメントの更新に失敗しました');
    }
}

private function reportMain() {
    //ここまでに$data用意

    //保存処理
    try {
        $this->reportSave($data);
    } catch (Exception $e) {
        //$e->getMessage() で 'コメントの更新に失敗しました' が得られます。
        //エラー処理
        return;
    } finary {
        //なにかあれば処理。この例ではfinaryは不要
    }
    //正常な場合のその後の処理
}


try catch を使用しない場合はこの様になります。
private function reportMain() {
    //ここまでに$data用意

    //保存処理
    if ($this->Report->save($data) === false) {
        //'コメントの更新に失敗しました'の処理などエラー処理
        return;
    }
    //正常な場合のその後の処理
}

この様に、try catch を使用するメリットがありません。
処理が分断されて分かりにくくなるだけです。
もしreportSave()で色々な前準備や後処理を含めて行わせるのであれば意味が出てきますが、今のところそのような必要性を感じたことが有りません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/06 21:45

    わざわざありがとうございます!
    これだけコード量に差が出るのですね。
    確かにtry catchのメリットをあまり感じませんね。

    //'コメントの更新に失敗しました'の処理などエラー処理
    のところは
    throw new Exception('コメントの更新に失敗しました');
    とか入れておけばいいでしょうか。

    キャンセル

  • 2015/08/06 22:09

    それは違います。

    CakePHPの場合、

    $this->Session->setFlash('コメントの更新に失敗しました');
    $this->redirect(array('controller'=>'Homes','action'=>'index'));
    return;

    などです。
    エラーメッセージをセットして、
    ホーム画面や目的の画面に遷移させます。

    View内では
    $this->Session->flash();
    でブラウザに表示されます。

    このあたりは自由に記述できます。try catch や throw に関する記述はここではしません。
    CakePHP参考書通りの記述になります。

    キャンセル

  • 2015/08/06 22:12

    if ($this->Report->save($data) === false) {
      //エラー時の記述
    } else {
      //正常時の記述
    }
    これでも大丈夫です。

    キャンセル

  • 2015/08/06 23:46

    ありがとうございます!!!

    キャンセル

+1

phpの例外処理については公式サイトに詳しく書かれています。
http://php.net/manual/ja/language.exceptions.php

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/08/06 21:17

    再度回答ありがとうございます。
    じっくり読みます。

    キャンセル

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

  • ただいまの回答率 87.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る