【问题标题】:How to throw an exception from a CodeIgniter library如何从 CodeIgniter 库中抛出异常
【发布时间】:2012-08-23 08:49:12
【问题描述】:

我制作了一个 CodeIgniter 库,它依赖于现有的某个方法。这种方法曾经是“隐藏的”(没有记录,但似乎有效)。最终 CodeIgniter 使它成为 protected,所以我不能从库中调用它。在 GitHub 的开发版 CodeIgniter 中,我可以使用一个新的公共方法。

在我的库中,我使用is_callable 来检测使用哪种方法,旧方法还是新方法。问题是,在当前稳定版本的 CodeIgniter 中,两者都不存在。因此,库将失败。有没有一种方法可以优雅地出错,或者从我的构造函数中抛出异常?目前,如果这两种方法都不可用,脚本将在尝试调用该方法时崩溃。

我不知道 CodeIgniter 库由于缺少方法而无法正确加载的约定。

编辑:这是我要问的那一行:

$this->func = is_callable(array($this->db, '_compile_select')) ? '_compile_select' : 'get_compiled_select';

如果这些都不存在(_compile_selectget_compiled_select),那么当库尝试调用$this->func 时会出错。我不知道惯例,我可以从图书馆打电话给show_error 吗?从库的构造函数中抛出错误的正确方法是什么?

【问题讨论】:

  • 我认为 try-catch 在这种情况下不可行?
  • @Matt:我不知道你是否可以从库的构造函数中抛出异常。特别是,如果您要自动加载库。我不知道 CodeIgniter 库由于缺少方法而无法正确加载的约定是什么。
  • 您使用的实际代码是什么?当然,你想要发生什么?抛出异常与“优雅地出错”完全不同,它将完全停止脚本。你的意思是在catch 块中做其他事情还是什么?详情?
  • @WesleyMurch:我已将代码添加到问题中。我只是想知道我的库是否有办法说“你不能使用这个库,你缺少一个函数”,而不是在尝试使用不存在的函数时崩溃。

标签: php codeigniter exception


【解决方案1】:

如果目标只是一个漂亮的错误消息而不是致命错误,那真的很简单:

$this->func = is_callable(array($this->db, '_compile_select')) ? '_compile_select' : 'get_compiled_select';

if ( ! is_callable(array($this, $this->func)))
{
    show_error("You can't use this library, you're missing a function");
}

基本上,不要假设 get_compiled_select 在您的条件中是可调用的 - 首先检查。

我可以从库中调用 show_error 吗?

是的,这是core/Common.php 中定义的功能之一,您可以在 CI 应用程序的任何地方使用它。

当然,从技术上讲,这不是throwing 例外,而是 Codeigniter 的惯例。如果您想catch 错误并尝试其他方法,这可能会出现问题:

try {
    $this->load->library('might_not_exist', 'alias');
} catch (Exception $e) {
    $this->load->library('definitely_exists', 'alias');
}

上述方法不起作用,因为show_error() 将被加载程序调用并在您的 catch 块执行之前退出程序。

【讨论】:

  • 我不确定从库中调用 show_error 是否符合惯例。
  • Common.php 中的所有内容都是全球可用的。 Codeigniter 并没有真正的约定,你只是自己编造的。
  • 是的,我注意到在查看其他人的代码时:P
【解决方案2】:

我不确定,但看到这个 URL 我认为它对你很有帮助。

http://codeigniter.com/forums/viewthread/67096/

另见

http://phpcodeignitor.blogspot.in/2011/07/php-exception.html

或者试试这个

MY_Exceptions.php 并将其放入 /applications/libraries/

 <?php  if (!defined('BASEPATH')) exit('No direct script access allowed');

class MY_Exceptions extends CI_Exceptions{

    function MY_Exceptions(){
        parent::CI_Exceptions();

    }

    function show_404($page = '')
    {
    echo 'test';
    }

    function show_error($heading, $message, $template = 'error_general')
    {
echo 'test';    
}

    function show_php_error($severity, $message, $filepath, $line)
    {
         echo 'test';
         }
}
?>

MY_Exceptions 中的函数似乎根本没有被覆盖。异常中的函数是运行的函数

【讨论】:

    猜你喜欢
    • 2011-09-07
    • 1970-01-01
    • 2017-02-19
    • 2014-04-03
    • 2017-08-13
    • 2010-12-16
    • 2016-12-25
    • 1970-01-01
    • 2020-05-08
    相关资源
    最近更新 更多