php異常處理小總結

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{
}
相關文章
相關標籤/搜索