异常类修复多处错误:

1.文字描述错误
2.异常处理类use引入错误
3.增加异常处理类完整的使用示例代码
This commit is contained in:
张奇峰 2019-06-24 01:19:38 +08:00
parent 58da2bad85
commit 2cb87080c6

View File

@ -15,7 +15,8 @@ return [
// 这里的 http 对应 config/autoload/server.php 内的 server 所对应的 name 值
'http' => [
// 这里配置完整的类命名空间地址已完成对该异常处理器的注册
\App\ExceptionHandler\FooExceptionHandler::class,
\App\Exception\Handler\FooExceptionHandler::class,
\App\Exception\Handler\MyExceptionHandler::class,
],
],
];
@ -25,23 +26,24 @@ return [
# 定义异常处理器
我们可以在任意位置定义一个 `类(Class)`基础抽象类 `Hyperf\Framework\ExceptionHandler` 并实现其中的抽象方法,如下:
我们可以在任意位置定义一个 `类(Class)`继承抽象类 ` Hyperf\ExceptionHandler\ExceptionHandler;` 并实现其中的抽象方法,如下:
```php
<?php
namespace App\ExceptionHandler;
namespace App\Exception\Handler;
use Hyperf\Framework\ExceptionHandler;
use Hyperf\ExceptionHandler\ExceptionHandler;
use Hyperf\HttpMessage\Stream\SwooleStream;
use Psr\Http\Message\ResponseInterface;
use App\Exception\CustomException\MyException;
use Throwable;
class FooExceptionHandler extends ExceptionHandler
class MyExceptionHandler extends ExceptionHandler
{
public function handle(Throwable $throwable, ResponseInterface $response)
{
// 判断传入的异常是否是该处理器希望处理的异常
if ($throwable instanceof FooException) {
if ($throwable instanceof MyException) {
// 传入的异常是我们希望捕获的 FooException我们格式化为 JSON 格式并输出到用户端
$data = json_encode([
'code' => $throwable->getCode(),
@ -51,7 +53,51 @@ class FooExceptionHandler extends ExceptionHandler
}
// 传入的异常不是该处理器希望处理的异常,不处理并交由下一个异常处理器处理
}
public function isValid(Throwable $throwable): bool
{
return true;
}
}
```
# 自定义我的异常类
```php
<?php
namespace App\Exception\CustomException;
use Throwable;
class MyException extends \Exception
{
function __construct(string $message = "", int $code = 0, Throwable $previous = null)
{
parent::__construct($message, $code, $previous);
}
function fun_custom(){
// Tudo something
}
}
```
# 我们可以在控制器手动抛出异常,就会触发以上异常处理相关代码
```php
//以下是控制器代码片段
use App\Exception\CustomException\MyException;
... ...
public function index()
{
//假设用户没有提交参数username我们就触发刚才定义的异常类
if($this->request->input('username')){
return $this->response->redirect('http://www.baidu.com');
}else{
throw new MyException('MyExceptions',-1);
}
}
// 如果程序没有收到username参数浏览器收到的结果就是状态码500并且收到了json数据MyExceptionHandler响应的数据
```
在上面这个例子,我们先假设 `FooException` 是存在的一个异常,以及假设已经完成了该处理器的配置,那么当业务抛出一个没有被捕获处理的异常时,就会根据配置的顺序依次传递,整一个处理流程可以理解为一个管道,若前一个异常处理器存在返回值则不再往后传递,若最后一个配置的异常处理器仍不对该异常进行捕获处理,那么就会交由 Hyperf 的默认异常处理器处理了。