国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

異常處理

配置

config/exception.php

return [
    // 這里配置異常處理類
    '' => support\exception\Handler::class,
];

多應(yīng)用模式時(shí),你可以為每個(gè)應(yīng)用單獨(dú)配置異常處理類,參見多應(yīng)用

默認(rèn)異常處理類

webman中異常默認(rèn)由 support\exception\Handler 類來(lái)處理??尚薷呐渲梦募?code>config/exception.php來(lái)更改默認(rèn)異常處理類。異常處理類必須實(shí)現(xiàn)Webman\Exception\ExceptionHandlerInterface 接口。

interface ExceptionHandlerInterface
{
    /**
     * 記錄日志
     * @param Throwable $e
     * @return mixed
     */
    public function report(Throwable $e);

    /**
     * 渲染返回
     * @param Request $request
     * @param Throwable $e
     * @return Response
     */
    public function render(Request $request, Throwable $e) : Response;
}

渲染響應(yīng)

異常處理類中的render方法是用來(lái)渲染響應(yīng)的。

如果配置文件config/app.phpdebug值為true(以下簡(jiǎn)稱app.debug=true),將返回詳細(xì)的異常信息,否則將返回簡(jiǎn)略的異常信息。

如果請(qǐng)求期待是json返回,則返回的異常信息將以json格式返回,類似

{
    "code": "500",
    "msg": "異常信息"
}

如果app.debug=true,json數(shù)據(jù)里會(huì)額外增加一個(gè)trace字段返回詳細(xì)的調(diào)用棧。

你可以編寫自己的異常處理類來(lái)更改默認(rèn)異常處理邏輯。

業(yè)務(wù)異常 BusinessException

有時(shí)候我們想在某個(gè)嵌套函數(shù)里終止請(qǐng)求并返回一個(gè)錯(cuò)誤信息給客戶端,這時(shí)可以通過(guò)拋出BusinessException來(lái)做到這點(diǎn)。
例如:

<?php
namespace app\controller;

use support\Request;
use support\exception\BusinessException;

class FooController
{
    public function index(Request $request)
    {
        $this->chackInpout($request->post());
        return response('hello index');
    }

    protected function chackInpout($input)
    {
        if (!isset($input['token'])) {
            throw new BusinessException('參數(shù)錯(cuò)誤', 3000);
        }
    }
}

以上示例會(huì)返回一個(gè)

{"code": 3000, "msg": "參數(shù)錯(cuò)誤"}

注意
業(yè)務(wù)異常BusinessException不需要業(yè)務(wù)try捕獲,框架會(huì)自動(dòng)捕獲并根據(jù)請(qǐng)求類型返回合適的輸出。

自定義業(yè)務(wù)異常

如果以上響應(yīng)不符合你的需求,例如想把msg要改為message,可以自定義一個(gè)MyBusinessException

新建 app/exception/MyBusinessException.php 內(nèi)容如下

<?php

namespace app\exception;

use support\exception\BusinessException;
use Webman\Http\Request;
use Webman\Http\Response;

class MyBusinessException extends BusinessException
{
    public function render(Request $request): ?Response
    {
        // json請(qǐng)求返回json數(shù)據(jù)
        if ($request->expectsJson()) {
            return json(['code' => $this->getCode() ?: 500, 'message' => $this->getMessage()]);
        }
        // 非json請(qǐng)求則返回一個(gè)頁(yè)面
        return new Response(200, [], $this->getMessage());
    }
}

這樣當(dāng)業(yè)務(wù)調(diào)用

use app\exception\MyBusinessException;

throw new MyBusinessException('參數(shù)錯(cuò)誤', 3000);

json請(qǐng)求將收到一個(gè)類似如下的json返回

{"code": 3000, "message": "參數(shù)錯(cuò)誤"}

提示
因?yàn)锽usinessException異常屬于業(yè)務(wù)異常(例如用戶輸入?yún)?shù)錯(cuò)誤),它是可預(yù)知的,所以框架并不會(huì)認(rèn)為它是致命錯(cuò)誤,并不會(huì)記錄日志。

總結(jié)

在任何想中斷當(dāng)前請(qǐng)求并返回信息給客戶端的時(shí)候可以考慮使用BusinessException異常。

編輯于2025-02-06 22:08:54 完善本頁(yè) +發(fā)起討論
贊助商