2019年8月23日10:56:31php
php不少開發不習慣使用異常處理,由於web開發,重在於快速開發,易用性,高性能,不強調程序健壯性java
php的異常使用其實不是太完善,易用性也差點,固然這個對比其餘語言來講laravel
比較標準的作法就是先劃分錯誤類型,分別針對錯誤類型制訂處理方案和機制web
好比業務邏輯級別錯誤,系統級別錯誤,致命錯誤等,針對不一樣級別錯誤,處理錯誤,加強代碼的健壯性和訪問友好性json
class LogicException extends Exception{ //重定義構造器使第一個參數 message 變爲必須被指定的屬性 public function __construct($message, $code=0){ //能夠在這裏定義一些本身的代碼 //建議同時調用 parent::construct()來檢查全部的變量是否已被賦值 parent::__construct($message, $code); } public function __toString() { //重寫父類方法,自定義字符串輸出的樣式 return __CLASS__.":[".$this->code."]:".$this->message."<br>"; } public function customFunction() { //爲這個異常自定義一個處理方法 echo "按自定義的方法處理出現的這個類型的異常<br>"; } }
在最終錯誤返回的時候,針對具體錯誤類型作處理性能
Controllerthis
public function test(Request $Request) { try { return response()->json(['code' => 200, 'msg' => '操做成功', 'data' => $data]); } catch (\Exception $e) { dealErr($e); }
function dealErr(\Exception $e) { if ($e instanceof LogicException) { } elseif ($e instanceof \Exception) { } else { throw new \Exception('未知錯誤異常'); } //獲取請求參數 request()->all(); //寫入日誌 Log::info(); //返回信息 return response()->json(['code' => 400, 'msg' => $e->getMessage(), 'error' => formaErr($e)]); }
下面是一個比較經常使用的demospa
OrderController日誌
public function getSonSaleOrderPay(Request $Request) { try { $page = parameterCheck($Request->page, 'int', 1); $pageSize = parameterCheck($Request->page_size, 'int', 15); $parent_order_key = parameterCheck($Request->parent_order_key, 'string', ''); $data = SaleParentOrderService::getSonOrderPay(parent::$shop_id, $parent_order_key, $page, $pageSize); return response()->json(['code' => 200, 'msg' => '操做成功', 'data' => $data]); } catch (\Exception $e) {
return response()->json(['code' => 400, 'msg' => $e->getMessage(), 'error' => formaErr($e)]);
} }
SaleParentOrderService
public static function getSonOrderPay(int $shop_id, string $parent_order_key, int $page = 1, int $pageSize = 15) { try { $SaleOrder = SaleOrder::where('is_delete', 10)->where('shop_id', $shop_id)->where('parent_order_key', $parent_order_key)->where('order_category', 20)->first(); if (empty($SaleOrder)) { throw new \Exception('父訂單號錯誤or訂單數據被刪除'); } $SaleOrderArray = SaleOrder::where('is_delete', 10)->where('shop_id', $shop_id)->where('parent_order_key', $parent_order_key)->where('order_category', 20)->get(); if (empty($SaleOrderArray)) { return ['total' => 0, 'list' => []]; } } catch (\Exception $e) { throw $e; } }
//格式化錯誤信息,方便輸出 function formaErr(\Exception $e) { // if ($e instanceof \Exception == false) { // throw new \Exception('數據類型錯誤'); // } $msg['File'] = $e->getFile(); $msg['Line'] = $e->getLine(); $msg['Msg'] = $e->getMessage(); $msg['Trace'] = $e->getTraceAsString(); return $msg; }
注意這 是本身 throw 否則laravel會拋出就會返回不友好,特別是get請求的時候,code
我我的是但願php引入java throws,這樣在多層級別代碼的時候,能夠減小不少沒必要要的邏輯代碼的編寫,直接往上層扔,方便易用
public static void function() throws NumberFormatException{ }