webman异常处理

sunwenzheng

webman异常处理

全局处理一般是用这个函数 set_exception_handler
下面写个例子

<?php 
namespace Demo;

// 自定义异常
class CustomException extends \Exception {
    public function errorMessage() {
        // 错误信息
        return "\nError on line " . $this->getLine() . " in " . $this->getFile()
             . ": " . $this->getMessage();
    }
}

// 自定义异常处理
class CustomExceptionHandler {
    public function render() {
        echo "\n";
        echo "CustomExceptionHandler";
        echo "\n";
    }
}

function handleException($exception) {
    echo "\n";
    echo "Caught exception: " . $exception->getMessage() . "\n";
    echo "\n".get_class($exception);
    // 这里可以做成一个k-v映射,或者按照一定规则对应
    $handler = new (get_class($exception).'Handler')();
    $handler->render();

    echo $exception->errorMessage();
    echo "\n";
    echo "\n";
}

set_exception_handler('\Demo\handleException');

throw new \Demo\CustomException("Invalid data!");

输出


Caught exception: Invalid data!

Demo\CustomException
CustomExceptionHandler

Error on line 34 in /project/webman/catch_error.php: Invalid data!

我一开始以为webman也是类似这样的形式,

其实不是,webman是自己做了处理

webman的流程如下

主要是在 vendor/workerman/webman-framework/src/App.php 文件里

https://github.com/walkor/webman-framework/blob/97d8f4cb20e6a862ed1e0d4a236e5234f7aed0c0/src/App.php#L168

onMessage 方法 执行 static::send($connection, $callback($request), $request);

一层层执行完中间件后,执行路由对应的Controller,如果Controller这里抛出了异常

那么 回到那个 array_reduce 地方,捕捉到异常后,传递给异常处理器
截图

https://github.com/walkor/webman-framework/blob/97d8f4cb20e6a862ed1e0d4a236e5234f7aed0c0/src/App.php#L354

异常处理器这里将参数给render方法
截图
https://github.com/walkor/webman-framework/blob/97d8f4cb20e6a862ed1e0d4a236e5234f7aed0c0/src/App.php#L262

这个render 方法其实 是 ExceptionHandlerInterface 的,
ExceptionHandler 实现了 ExceptionHandlerInterface,
Handler 继承 ExceptionHandler 又重写了。

https://github.com/walkor/webman-framework/blob/97d8f4cb20e6a862ed1e0d4a236e5234f7aed0c0/src/support/exception/Handler.php#L39

到这里就很清楚了,
这个 Handler 就是 config/exception.php 里面的 support\exception\Handler::class 。
截图

774 0 1
0个评论

sunwenzheng

980
积分
0
获赞数
0
粉丝数
2022-08-02 加入
🔝