ホームページ  >  記事  >  バックエンド開発  >  ThinkPHP の例外処理の詳細な説明

ThinkPHP の例外処理の詳細な説明

不言
不言オリジナル
2018-06-01 11:56:271818ブラウズ

PHP のデフォルトの例外処理とは異なり、ThinkPHP は単純なエラー メッセージではなく、人間化されたエラー ページをスローします。次の記事では、サンプル コードを使用して、主に関連情報を紹介します。必要な方は参照してください

例外とは

より広い観点から見ると、例外には 2 つの側面があります。一方で、例外は、プログラム実行時の構文エラーと実行時エラーによって引き起こされます。一方で、正しいフィードバックが与えられない場合、たとえば、クライアントが特定の製品を問い合わせたいのにそれが見つからない場合も例外だと思います。

最初の例外 TP フレームワーク自体はページにエラー情報を出力しますが、2 番目の例外は一般に情報を出力しないため、デバッグするのに非常に不便です。

この記事では、ThinkPHP の例外処理に関する関連コンテンツを詳しく紹介し、皆さんの参考と学習のために共有します。以下では多くを述べませんが、詳細な紹介を見てみましょう。

前提環境

現在、PHPはフロントエンド用のインターフェースを提供していることが多いため、例外処理もこれに基づいています。

開発段階では、TP の独自の例外処理は例外情報をページに出力することであり、これによりニーズを満たすことができますが、本番環境では、例外を別の方法で処理する必要があります。

この記事は実稼働環境での例外処理に関するものです

AOP プログラミング

現在、多くの言語で AOP プログラミングの考え方が非常に人気があります。つまり、平たく言えば、アスペクト指向のプログラミングの考え方です。複数の問題を同じ方法で個別に処理するのではなく、統一された方法で問題に対処する 例外処理については、統一された例外情報を定義し、統一された方法で処理することです

一般的な考え方

例外処理クラスを作成し、デフォルトの例外処理クラスのレンダリング メソッドを書き換えてから、カスタム例外処理クラスを使用してすべての例外を処理するように設定します

コードの実装

ルート ディレクトリにディレクトリ例外を作成し、ExceptionHandle を作成します。このクラスはハンドル クラスを継承する必要があります

class ExceptionHandler extends Handle

例外情報を定義するためにいくつかのプロパティを作成します

// http 错误码 
private $code; 
// 自定义异常信息 
private $msg; 
// 自定义错误码 
private $errorCode;

で throw new Exception() を使用するときに、Handle クラスの render メソッドをオーバーライドします。例外情報をスローするコードは、実際には render メソッドと呼ばれるため、独自の情報を返すにはこのメソッドをオーバーライドする必要があります

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',

で次の構成を変更し、カスタム例外処理クラスを実行します

One Class例外は、ユーザーの動作によって引き起こされる例外です。たとえば、条件を満たすデータが見つかりません (別の観点から見ると、これは実際には例外ではありません)。ユーザーによって発生する例外は多くの種類に分類されるため、関連するクラスをカスタマイズする必要があります。

最初に親クラスを定義します

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']; 
  } 
 } 
}

次に、見つからない製品情報を処理する例外処理クラスを定義します。これは、親クラスの各属性をオーバーライドするために使用され、このクラスの属性情報もmsg

class ProductNotFoundException extends BaseException 
{ 
 //http 状态码 
 public $code = 404; 
//错误具体消息 
 public $msg = "请求的产品不存在"; 
//自定义错误码 
 public $errorCode = 40000; 
}

異なる例外を処理します

renderメソッドでは、異なる例外に従って個別に処理します

//分别处理两种不容类型异常:1、用户错误 2.代码与运行时错误 
  if ($ex instanceof BaseException) { 
 
  } else { 
  
  }

注:例外がスローされた場合、 render は関数が実行され、スローされた例外オブジェクトをパラメーター $ex にコピーします。そのため、このパラメーターに基づいて例外の種類を判断できます

今重要なのは本番環境なので、返された例外情報がこれにより、スタック情報などを含むエラー情報がページ上に出力されます。

その後、フロントエンド担当者とバックエンド担当者の両方が理解できる情報は json である必要があります (もちろん xml でも可能です)。レンダリング メソッド

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 に変更することを忘れないでください。実稼働環境用

関連する推奨事項:

tpフレームワーク(thinkPHP)は、ログインパスワードを3回間違えるとアカウントをロックする機能を実装します

Thinkphp5のカスタムラベル

以上がThinkPHP の例外処理の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。