<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                # 異常處理 和PHP默認的異常處理不同,ThinkPHP拋出的不是單純的錯誤信息,而是一個人性化的錯誤頁面。 - [異常顯示](#_4) - [異常忽略](#_27) - [異常處理接管](#_42) - [手動拋出和捕獲異常](#_104) - [HTTP 異常](#HTTP__164) ## 異常顯示 在調試模式下,系統默認展示的異常頁面: ![](https://box.kancloud.cn/cc2522ef8a6b4c94f2ca1421619e87ca_736x642.png) > 只有在調試模式下面才能顯示具體的錯誤信息,如果在部署模式下面,你可能看到的是一個簡單的提示文字,例如: ![](https://box.kancloud.cn/f97804ae6c541d6e10207e6a565c3e2d_501x125.png) 你可以通過設置`exception_tmpl`配置參數來自定義你的異常頁面模板,默認的異常模板位于: ``` thinkphp/tpl/think_exception.tpl ``` 你可以在應用配置文件`app.php`中更改異常模板 ``` // 自定義異常頁面的模板文件 'exception_tmpl' => Env::get('app_path') . 'template/exception.tpl', ``` 默認的異常頁面會返回`500`狀態碼,如果是一個`HttpException`異常則會返回HTTP的錯誤狀態碼。 ## 異常忽略 > #### 本著嚴謹的原則,`5.0`版本開始默認情況下會對任何錯誤(包括警告錯誤)拋出異常,如果不希望如此嚴謹的拋出異常,可以使用下面方法設置。 默認框架會捕獲所有的錯誤,包括PHP警告級別的錯誤,你可以在**應用配置文件或者公共文件**中設置要報告的錯誤級別,例如: ``` // 除了 E_NOTICE,報告其他所有錯誤 error_reporting(E_ALL ^ E_NOTICE); ``` > 由于錯誤機制的注冊順序問題,在入口文件中設置錯誤級別無效。 > 系統產生的異常和錯誤都是程序的隱患,要盡早排除和解決,而不是掩蓋。對于應用自己拋出的異常則做出相應的捕獲處理。 ## 異常處理接管 框架支持異常處理由開發者自定義類進行接管,需要在應用配置文件`app.php`中配置參數`exception_handle`。 最簡單的方式是使用閉包定義異常處理,例如: ``` 'exception_handle' => function($e) { // 參數驗證錯誤 if ($e instanceof \think\exception\ValidateException) { return json($e->getError(), 422); } // 請求異常 if ($e instanceof \think\exception\HttpException && request()->isAjax()) { return response($e->getMessage(), $e->getStatusCode()); } }, ``` 如果需要更復雜的異常處理,可以把`exception_handle`配置定義為異常處理類的名稱,例如: ``` // 異常處理handle類 留空使用 \think\exception\Handle 'exception_handle' => '\\app\\common\\exception\\Http', ``` 自定義類需要繼承`think\exception\Handle`并且實現`render`方法,可以參考如下代碼: ``` <?php namespace app\common\exception; use Exception; use think\exception\Handle; use think\exception\HttpException; use think\exception\ValidateException; class Http extends Handle { public function render(Exception $e) { // 參數驗證錯誤 if ($e instanceof ValidateException) { return json($e->getError(), 422); } // 請求異常 if ($e instanceof HttpException && request()->isAjax()) { return response($e->getMessage(), $e->getStatusCode()); } // 其他錯誤交給系統處理 return parent::render($e); } } ``` 自定義異常處理的主要作用是根據不同的異常類型發送不同的狀態碼和響應輸出格式。 > 需要注意的是,如果自定義異常處理類沒有再次調用系統`render`方法的話,配置`http_exception_template`就不再生效,具體可以參考`Handle`類內實現的功能。 ## 手動拋出和捕獲異常 ThinkPHP大部分情況異常都是自動拋出和捕獲的,你也可以手動使用`throw`來拋出一個異常,例如: ``` // 使用think自帶異常類拋出異常 throw new \think\Exception('異常消息', 10006); ``` 系統提供了一個助手函數簡化異常的代碼,用法如下: > ### exception('異常信息','異常代碼','異常類') 異常代碼默認為`0`,可以根據應用的異常設計來定義,異常類如果不傳表示拋出默認的`think\Exception`異常,下面是示例: ``` // 使用助手函數拋出異常 exception('異常消息', 10006); ``` 如果需要拋出自定義異常,可以使用: ``` // 拋出自定義異常 exception('異常消息', 10006,'\app\common\exception\NotFoundException'); ``` 手動捕獲異常方式是使用`try-catch`,例如: ``` try { // 這里是主體代碼 } catch (ValidateException $e) { // 這是進行驗證異常捕獲 return json($e->getError()); } catch (\Exception $e) { // 這是進行異常捕獲 return json($e->getMessage()); } ``` > 支持使用`try-catch-finally`結構捕獲異常。 可以使用PHP的異常捕獲進行必要的處理,但需要注意一點,在異常捕獲中不要使用`think\Controller`類的error、success和redirect方法,因為上述三個方法會拋出`HttpResponseException`異常,從而影響正常的異常捕獲,例如: ``` try{ Db::name('user')->find(); $this->success('執行成功!'); }catch(\Exception $e){ $this->error('執行錯誤'); } ``` 應該改成 ``` try{ Db::name('user')->find(); }catch(\Exception $e){ $this->error('執行錯誤'); } $this->success('執行成功!'); ``` ## HTTP 異常 可以使用`\think\exception\HttpException`類來拋出異常 框架提供了一個`abort`助手函數快速拋出一個HTTP異常: ``` <?php namespace app\index\controller; use think\Controller; class Index extends Controller { public function index() { // 拋出 HTTP 異常 throw new \think\exception\HttpException(404, '異常消息'); } } ``` 系統提供了助手函數`abort`簡化HTTP異常的處理,例如: 框架提供了一個`abort`助手函數快速拋出一個HTTP異常: ``` <?php namespace app\index\controller; use think\Controller; class Index extends Controller { public function index() { // 拋出404異常 abort(404, '頁面異常'); } } ``` 如果你的應用是API接口,那么請注意在客戶端首先判斷HTTP狀態碼是否正常,然后再進行數據處理,當遇到錯誤的狀態碼的話,應該根據狀態碼自行給出錯誤提示,或者采用下面的方法進行自定義異常處理。 **部署模式**下一旦拋出了`HttpException`異常,可以定義單獨的異常頁面模板,只需要在應用配置文件中增加: ``` 'http_exception_template' => [ // 定義404錯誤的模板文件地址 404 => Env::get('app_path') . '404.html', // 還可以定義其它的HTTP status 401 => Env::get('app_path') . '401.html', ] ``` 模板文件支持模板引擎中的標簽。 > `http_exception_template`配置僅在部署模式下面生效。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看