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

ThinkPHP_php の例での例外処理の詳細な説明

jacklove
jackloveオリジナル
2018-06-25 17:01:092551ブラウズ

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;

render メソッドをオーバーライドします。コード内で throw new Exception() メソッドを使用して例外情報をスローすると、実際には 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',

次に実行します

#カスタム例外処理クラス

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

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

# #Handling など、このクラスの属性情報も変更される可能性があります。さまざまな例外

render メソッドで例外を個別に処理します

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

命令: In throw 例外が発生したときレンダリング関数が実行され、スローされた例外オブジェクトがパラメーター $ex にコピーされるため、例外のタイプはこのパラメーターに基づいて決定できます。

ここで重要なのは運用環境なので、次のようにします。上記のようにスタック情報などを含むエラー情報をページ上に出力するのではなく、フロントエンド担当者が理解できる例外情報を返したいと考えています。

那么前前端贺后端人员都能够看懂的信息一定是 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

总结

您可能感兴趣的文章:

PHP7基于curl实现的上传图片功能php技巧

PHP区块查询实现方法分析php技巧

PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析php技巧






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

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