【问题标题】:Throwing an Exception inside Object Class and catching it outside?在对象类中抛出异常并在外面捕获它?
【发布时间】:2018-12-22 23:19:26
【问题描述】:

我想要做的是在类中抛出一个异常。

然后在执行的时候就可以在外面捕捉到了。

class api {

    public function __construct($user_id, $token) {}

    public function post($data) {
        throw new customException\Post('Error 1');
    }

}

try {

    $api = new api('id','key');
    $output = $api->post($data);

} catch(customException\Post $e) {
    var_dump($e);
} catch(exception $e) {
    var_dump($e);
}

我怎样才能让这样的事情发挥作用?


我无法让customException\Post 那样工作...这是为什么呢?

当我使用customException 时出现此错误:

Uncaught ArgumentCountError: Too few arguments to function api::__construct(), 1 passed in /var/www/.../api_2.3.php on line 81 and exactly 2 expected in /var/www/.../api_2.3.php:28

【问题讨论】:

  • 您的自定义异常类在哪里?什么不工作?错误?
  • @LawrenceCherone 在问题中发布了错误。
  • 在您的代码中,您将 2 个参数传递给 api 类构造,所以这很混乱..
  • @LawrenceCherone 构造没有问题,只是与此无关,我将其留空(在此处)。
  • 什么$api = new api('id','key');?你也在使用自动加载器吗?

标签: php api exception


【解决方案1】:

如果你不使用命名空间:

<?php
class CustomException_Post extends Exception {}

class api {
    public function __construct($user_id, $token) {}

    public function post($data) {
        throw new CustomException_Post('Error 1');
    }
}

$data = [];
try {
    $api = new api('id','key');
    $output = $api->post($data);
} catch (CustomException_Post $e) {
    var_dump($e);
} catch (Exception $e) {
    var_dump($e);
}

https://3v4l.org/Q196X

如果你是,那么你需要一个自动加载器,假设你使用的作曲家在添加你的 psr4 自动加载条目后看起来像这样

CustomException 文件夹中,名为Post.php 的文件。

<?php
namespace CustomException;
class Post extends \Exception {}

然后在你的代码中你可以使用:

<?php

use CustomException;

class api {
    public function __construct($user_id, $token) {}

    public function post($data) {
        throw new CustomException\Post('Error 1');
    }
}

$data = [];
try {
    $api = new api('id','key');
    $output = $api->post($data);
} catch (CustomException\Post $e) {
    var_dump($e);
} catch (\Exception $e) {
    var_dump($e);
}

【讨论】:

  • catch (Exception $e) 没有捕捉到对象类内部发生的错误(我没有抛出它)。我也需要尝试并赶上那里吗?
  • 项目等级是什么意思?您只能捕获一次,因此如果 CustomException 被捕获,那么它将不会命中下一个捕获块。如果在到达全局范围时没有 try catch 换行,则它未被捕获。
  • 不,风俗没有抓住。错误地我试图检查is_array() 我检查的数组不正确。所以得到了一个未捕获的错误。我怎么也抓到这些?
  • 这是我得到的错误:Fatal error: Uncaught Error: Cannot use object of type stdClass as array in 那没有被捕获。我知道是什么导致了错误,并且是故意的。我怎么能抓住这个?
  • 使用 Throwable 3v4l.org/3O9Q0 虽然 >= PHP 7,所以尽量避免在你的代码中使用对象作为数组,除非你使用 ArrayObject 的 3v4l.org/PoibB ;p
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-13
  • 1970-01-01
  • 2021-05-08
  • 1970-01-01
  • 2020-10-03
  • 1970-01-01
相关资源
最近更新 更多