PHP のデフォルトの例外処理とは異なり、ThinkPHP は単純なエラー メッセージではなく、人間化されたエラー ページをスローします。この記事では主に ThinkPHP の例外処理に関する関連情報を紹介します。サンプル コードが詳しく紹介されています。必要な人は参照してください。
例外とは
広い観点から見ると、例外には 2 つの側面があります。一方で、プログラム実行時の構文エラーや実行時エラーによって例外が発生することもあると思います。たとえば、クライアントが特定の製品をクエリしたいのに、それが見つからない場合も同様だと思います。一種の異常。
最初の例外 TP フレームワーク自体はページにエラー情報を出力しますが、2 番目の例外は通常何も情報を出力しないため、デバッグには非常に不便です。
この記事では、ThinkPHP の例外処理に関する関連コンテンツを詳しく紹介し、皆さんの参考と学習のために共有します。以下では多くを述べませんが、詳細な紹介を見てみましょう。
前提環境
現在、PHP はフロントエンド用のインターフェイスを提供していることが多いため、例外処理もこれに基づいています。
開発段階では、TP の独自の例外処理は例外情報をページに出力することでニーズに応えますが、運用環境では、例外を別の方法で処理する必要があります。
この記事は実稼働環境での例外処理に関するものです
AOP プログラミング
現在、多くの言語で AOP プログラミングの考え方が非常に人気があります。指向プログラミングの考え方、普及 つまり、複数の問題を同じように扱うのではなく、統一的に処理することです。例外処理については、統一した例外情報を定義し、統一的に処理することです
一般的な考え方
例外処理クラスをカスタマイズし、デフォルトの例外処理クラスの render メソッドをオーバーライドして、すべての例外処理を処理するようにカスタム例外処理クラスを構成します。例外
コード実装
#ルート ディレクトリにディレクトリ例外を作成し、その下に ExceptionHandle.php を作成します。このクラスはハンドル クラスを継承する必要があります。
class ExceptionHandler extends Handle
// http 错误码 private $code; // 自定义异常信息 private $msg; // 自定义错误码 private $errorCode;
public function render(Exception $ex) { return json(['msg'=>"自定义异常信息"]); nbsp; }
public function getProduct($id) { try{ 3/0; } catch(Exception $ex){ throw $ex; } }
##次に、次のルートを追加します
Route::get("product/:id","api/v1.Product/getProduct");
テストするには次の URL を入力してください
http://z.cn/product/2
ページの出力結果は以下の通り
カスタム例外処理関数を実行していないことがわかります。カスタム例外処理を使用する
config.phpで次の構成を変更します
// 异常处理handle类 留空使用 \think\exception\Handle 'exception_handle' => 'app\lib\exception\ExceptionHandler',
次に実行します
#カスタム例外処理クラス
最初のタイプ例外は、ユーザーの動作によって引き起こされる例外です。たとえば、条件を満たすデータが見つかりません (別の観点から見ると、これは実際には例外ではありません)。ユーザーによって発生する例外は多くの種類に分類されるため、関連するクラスをカスタマイズする必要があります。 最初に親クラスを定義します
class BaseException extends Exception { //http 状态码 public $code; //错误具体消息 public $msg; //自定义错误码 public $errorCode; //构造函数用于接收传入的异常信息,并初始化类中的属性 public function __construct($params) { if (!is_array($params)) { return; } if (array_key_exists('code', $params)) { $this->code = $params['code']; } if (array_key_exists('msg', $params)) { $this->msg = $params['msg']; } if (array_key_exists('errorCode', $params)) { $this->errorCode = $params['errorCode']; } } }
class ProductNotFoundException extends BaseException { //http 状态码 public $code = 404; //错误具体消息 public $msg = "请求的产品不存在"; //自定义错误码 public $errorCode = 40000; }
render メソッドで例外を個別に処理します
//分别处理两种不容类型异常:1、用户错误 2.代码与运行时错误 if ($ex instanceof BaseException) { } else { }
那么前前端贺后端人员都能够看懂的信息一定是 json(当然也可以是xml)了,修改 render 方法
if ($ex instanceof BaseException) { $this->code = $ex->code; $this->msg = $ex->msg; $this->errorCode = $ex->errorCode; } else { //这里是在运行时产生的各种异常,所以无法准确输出异常信息,所以只能统一输出是服务器错误信息 $this->code = 500; $this->msg = "服务器内部错误"; $this->errorCode = 999; }
然后以 json 格式返回错误信息
$result = [ 'msg' => $this->msg, 'error_code' => $this->errorCode, 'request_url' => request()->url() ]; return json($result,$this->code);
至此,全局的异常处理就编写好了,下面在 product.php 中编码进行测试
public function getProduct($id) { //处理程序运行时错误 /*try{ 3/0; } catch(Exception $ex){ throw $ex; }*/ //处理用户行为产生的错误 $error=[ 'msg'=>'没有找到合适的产品' ]; $ex=new ProductNotFoundException($error); throw $ex; }
提示:生产环境不要忘了将 app_debug 修改为 false
总结
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析php技巧
以上がThinkPHP_php の例での例外処理の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。