php 检查对象是否为任何类型的异常

sg24os4d  于 2023-06-20  发布在  PHP
关注(0)|答案(1)|浏览(129)

在我的API中,我有一个名为ApiException的自定义异常。我想将代码中的所有错误消息和异常传递给这个自定义异常,以处理日志记录和响应返回。我在想这样的事情:

class ApiException extends Exception
{
    public $data;
    public $status;

    public function __construct($data, $status = 400)
    {
        $this->data = $data;
        $this->status = $status;
    }

    public function render()
    {
        $output = $this->getOutput();
        return response()->json($output, $this->status);
    }

    private function getOutput()
    {
        if (is_object($this->data) && $this->data instanceof Exception) {
            return $this->getOutputException();
        } else if (is_string($this->data)) {
            return $this->getOutputString();
        } else {
            return ['message' => $this->defaultMessage()];
        }
    }

    private function getOutputException()
    {
        // log exception
        // send notification
        return ['message' => $this->data->getMessage()];
    }

    private function getOutputString()
    {
        return ['message' => $this->data];
    }

    private function defaultMessage()
    {
        return __('message.defaultErrorMessage');
    }

}

我可以用它来返回一个简单的字符串:

$resource = Resource::find($id);
if (!$resource)
    throw new ApiException("resource not found!");

或者传递一个常规异常:

try {
    Table::insert($data);
} catch (\Exception $exception) {
    throw new ApiException($exception);
}

或其他例外:

$client = new GuzzleHttp\Client\Client();
try {
    return $client->request('GET', "http://something");
} catch (GuzzleHttp\Exception\ClientException\ClientException $e) {
    throw new ApiException($exception);
}

这就是我有问题的地方:is any kind of exception

private function getOutput()
{
    if (is_object($this->data) && $this->data instanceof Exception) {
        return $this->getOutputException();
    }
}

如何检查我的对象是否是异常?我指的是任何类型的异常,而不仅仅是一般的异常,比如GuzzleHttp\Exception\ClientException\ClientException

gfttwv5a

gfttwv5a1#

所有自定义异常扩展\Exception。试试这个:

$reflection = new \ReflectionClass($this->data);
if($reflection->isSubclassOf(Exception::class)) {
  //$this->data is a subclass of Exception
}

或者你的代码

if( $this->data instanceof Exception) {
 echo "yes";
}

相关问题