Tratamento imprevisível de exceção interna
1. Exceções imprevisíveis
Se campos indefinidos forem usados no método:
public function aa(){
echo $aa;
}
Erro ao visitar a página:
2. Solução:
1. Modifique ExceptionHandle.php no diretório do aplicativo
Modificada app
diretório ExceptionHandle.php
do render
tratamento 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:
Mas modificar diretamente
app
o arquivo de configuração no diretório não é muito bom, porqueapp
todos oscommon
arquivos no diretório afetarão todos os aplicativos. Se configurarmos ojson
erro de saída de formato como o acima , se o erro de saída do modelo também for retornado, ojson
formato 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 app
os ExceptionHandle.php
arquivos no diretório ;
(2) demo
Crie uma nova exception
pasta no aplicativo (no mesmo nível do controlador), crie uma nova Http.php
classe, imite a classe ExceptionHandle
herdada Handle
e substitua o render
método:
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 app
diretório provider.php
para o demo
diretório do aplicativo e modifique a think\exception\Handle
configuração:
provedor.php:
<?php
// 容器Provider定义文件
return [
'think\exception\Handle' => 'app\\demo\\exception\\Http',
];
A
api
mensagem 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 retornarjson
dados.
3. lançar manipulação de exceção
Adicione um método e throw
uma think\exception\HttpException
exceção ao controlador :
public function aa(){
throw new HttpException(404,"找不到相应的数据");
}
Resultado da visita:
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?
O motivo é que o render
mé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:
Mas este método $e->getStatusCode()
só está disponível throw
quando 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:
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);
}