Operações básicas do projeto ThinkPHP6 (10. Manipulação de exceção interna imprevisível)

1. Exceções imprevisíveis

Se campos indefinidos forem usados ​​no método:

public function aa(){
    
    
    echo $aa;
}

Erro ao visitar a página:
Insira a descrição da imagem aqui

2. Solução:

1. Modifique ExceptionHandle.php no diretório do aplicativo

Modificada appdiretório ExceptionHandle.phpdo rendertratamento de exceção método, costume add:

public function render($request, Throwable $e): Response
{
    
    
    // 添加自定义异常处理机制
    return show(config("status.error"), $e->getMessage());
    // 其他错误交给系统处理
    // return parent::render($request, $e);
}

Visite novamente para retornar o resultado anormal que definimos:
Insira a descrição da imagem aqui

Mas modificar diretamente appo arquivo de configuração no diretório não é muito bom, porque apptodos os commonarquivos no diretório afetarão todos os aplicativos. Se configurarmos o jsonerro de saída de formato como o acima , se o erro de saída do modelo também for retornado, o jsonformato será retornado , então não razoável.

2. Diferentes formatos de mensagem de erro são configurados para diferentes módulos de aplicativo

Veja o módulo API como exemplo:

(1) Restaure appos ExceptionHandle.phparquivos no diretório ;
(2) demoCrie uma nova exceptionpasta no aplicativo (no mesmo nível do controlador), crie uma nova Http.phpclasse, imite a classe ExceptionHandleherdada Handlee substitua o rendermétodo:
Insira a descrição da imagem aqui

Http.php:

<?php

namespace app\demo\exception;

use think\exception\Handle;
use think\Response;
use Throwable;

class Http extends Handle
{
    
    
    public $httpStatus = 500;
    /**
     * Render an exception into an HTTP response.
     *
     * @access public
     * @param \think\Request   $request
     * @param Throwable $e
     * @return Response
     */
    public function render($request, Throwable $e): Response
    {
    
    
        // 添加自定义异常处理机制
        return show(config("status.error"), $e->getMessage(), [],$this->httpStatus);
    }
}

(3) Em seguida, copie o appdiretório provider.phppara o demodiretório do aplicativo e modifique a think\exception\Handleconfiguração:

provedor.php:

<?php

// 容器Provider定义文件
return [
    'think\exception\Handle' => 'app\\demo\\exception\\Http',
];

A apimensagem acima é a mensagem de erro do módulo de configuração ; se o mecanismo do modelo de plano de fundo retornar um erro, você pode definir uma página de erro personalizada em vez de retornar jsondados.

3. lançar manipulação de exceção

Adicione um método e throwuma think\exception\HttpExceptionexceção ao controlador :

public function aa(){
    
    
    throw new HttpException(404,"找不到相应的数据");
}

Resultado da visita:
Insira a descrição da imagem aqui
parece correto. Amigos cuidadosos descobrirão que o código de status não está correto. O código de status da configuração de exceção que lancei acima é 404. A solicitação aqui é 500. Por que isso?
Insira a descrição da imagem aqui
O motivo é que o rendermétodo substituído na classe de tratamento de exceção personalizada acima contém um código de status personalizado $httpStatus=500:

public $httpStatus = 500;
public function render($request, Throwable $e): Response
{
    
    
    // 添加自定义异常处理机制
    return show(config("status.error"), $e->getMessage(), [],$this->httpStatus);
}

Alteramos o código de status retornado aqui para $e->getStatusCode():

return show(config("status.error"), $e->getMessage(), [],$e->getStatusCode());

Visite novamente, o código de status está OK:
Insira a descrição da imagem aqui

Mas este método $e->getStatusCode()só está disponível throwquando há uma exceção. Por exemplo, a primeira etapa da saída de um erro de variável desconhecida não tem esse método e a página relatará um erro, então aqui você precisa modificar a classe de tratamento de exceção:
Insira a descrição da imagem aqui
modifique a classe de tratamento de exceção Http.php, esses dois erros Todas as exceções podem ser acessadas normalmente:

public $httpStatus = 500;
public function render($request, Throwable $e): Response
{
    
    
    if(method_exists($e, "getStatusCode")){
    
    
        $httpStatus = $e->getStatusCode();
    }else{
    
    
        $httpStatus = $this->httpStatus;
    }
    // 添加自定义异常处理机制
    return show(config("status.error"), $e->getMessage(), [],$httpStatus);
}

Acho que você gosta

Origin blog.csdn.net/zy1281539626/article/details/110457731
Recomendado
Clasificación