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

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

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

1回答

997閲覧

【php】phpのエラーメッセージを無視して、エラーページを表示したい

hasshy

総合スコア102

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2021/07/27 04:56

エラーハンドリングを自作しようと考えています。
理想はLaravelのように、debugフラグが有効であればエラー内容表示せず、代わりのエラーページを表示したいです。

phpのエラーメッセージを無視してエラーページを表示するにはどのように実装すれば良いでしょうか?

仕様について

例えば、DB保存処理が失敗した時に次の事をしたいとします。

  1. 特定のメールアドレスに送りたとします。
  2. エラー内容を表示せず、エラーページを表示して処理を終える

現状

前述の1については次のような処理で実現できると思うのですが、2のエラーページ表示のスクリプトが思いつきません。

php

1 2public sendMail() { 3 4 $isSave = false; 5 try { 6 // DB保存処理は省略 7 8 // 送信フラグ 9 $isSave = true; 10 } catch($e) { 11   // メール送信 12 $isSave = false; 13 } 14 15 if(! $flag) { 16          mail('to@example.com', 'エラーメール', 'DBの保存に失敗しました。'); 17 throw new \Exception('DBの保存に失敗しました。') 18 } 19} 20

思いつく方法

エラーハンドラーを作って、描画後に止めてしまうという方法を思いつきました。

ただ、エラーハンドリングで検索しても、該当する方法が見つかりません。
もっと一般的な実装方法があるのでしょうか?

php

1 2public sendMail() { 3 // エラーハンドル定義 4 set_exception_handler(function($throwable) { 5 send_error_log($throwable); 6 7 // echoですが、実際はhtmlを出力します。 8 echo('エラーが発生しました'); 9 exit(); 10 }); 11 12 $isSave = false; 13 try { 14 // DB保存処理は省略 15 16 // 送信フラグ 17 $isSave = true; 18 } catch($e) { 19   // メール送信 20 $isSave = false; 21 } 22 23 if(! $flag) { 24             ini_set('display_errors', 'Off'); 25          mail('to@example.com', 'エラーメール', 'DBの保存に失敗しました。'); 26 throw new \Exception('DBの保存に失敗しました。') 27 } 28} 29

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

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

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

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

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

guest

回答1

0

質問者さんの中での「エラー」とは何かわからないのでなんとも言えませんが
別途エラーページを用意しているのなら
headerでLocationを指定して飛ばしてしまえばよいのでは?

PHP

1set_error_handler('myErrorHandler'); 2function myErrorHandler($errno, $errstr, $errfile, $errline){ 3 switch($errno) { 4 case E_NOTICE: 5 throw new exception("NOTICE"); 6 break; 7 case E_WARNING: 8 throw new exception("WARNING"); 9 break; 10 default: 11 throw new exception("ERR"); 12 } 13 return true; 14} 15try{ 16 print $a;//未定義の変数を参照 17}catch(exception $e){ 18 print $e->getMessage(); 19} 20try{ 21 print 1/0;//ゼロデブ 22}catch(exception $e){ 23 print $e->getMessage(); 24}

投稿2021/07/27 05:01

編集2021/07/27 07:34
yambejp

総合スコア116724

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

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

hasshy

2021/07/27 05:08

ご返答ありがとうございます。 言葉足らずで失礼しました。 エラーというのは、E_ALLで取得できるPHPエラーの事を指しています。 確かにおっしゃる通り、エラーページにリダイレクトさせても良いかもしれません。
yambejp

2021/07/27 05:26

E_ALLで取得するというと未定義の変数参照のE_NOTICEや 1/0などE_WARNING などですね? 文法エラーやパースエラーは非対応でよいのですか?
hasshy

2021/07/27 06:37

ご指摘ありがとうございます。 文法エラーやパースエラーも捌けるんですね… 知りませんでした。
yambejp

2021/07/27 06:44

> 文法エラーやパースエラーも捌けるんですね… いいえ構文エラーは捌けないので、非対応でいいですか?と聞いてます。
hasshy

2021/07/27 07:02

失礼しました。 > いいえ構文エラーは捌けないので、非対応でいいですか?と聞いてます。 はい 非対応で構いません。 本番環境ではエラーが発生した際に、できる限りphpエラーをそのまま表示したくないというのが目的ですので、出来ないものは仕方ないと思っております。
yambejp

2021/07/27 07:35

error_handlerを利用して関数内でエラーページに飛ぶか 例外を投げてcatch内で処理するかのどちらかでしょうね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問