代码显示和引发异常

2022-08-30 17:48:50

我最近为学校提交了一个项目,这是我在CodeIgniter中构建的。我不得不把它呈现给我的老师,当被问及我如何处理某些错误时,他告诉我抛出异常来拦截事件链中更早的事情。

我已经学会了如何抛出异常,以及如何使用块来呃,捕获和处理它们,但不知何故,当我开始使用CodeIgniter时,我忘记了它们,不再真正使用异常。try...catch

相反,由于缺乏更好的词,我只是“手动”处理错误:例如,我会使用布尔值来检查查询是否正确执行,并且我会使用返回的布尔值来处理查询的结果。如果 ,我会继续做我的事情,如果我“手动”抛出一条错误消息。该项目非常依赖于AJAX,错误消息会以一种非常奇特的方式弹出,从页面顶部下降;不确定当我抛出异常时这是否可能?我知道这基本上会在抛出异常时阻止代码执行,所以这不会以某种方式破坏事情吗?TRUEFALSETRUEFALSEthrow new Exception

我似乎还记得在某个地方读到过,抛出异常不是有史以来的最佳实践,但我再也找不到它的来源了,我不太确定情况是否如此;毕竟,我们确实学会了如何在课堂上使用它们,我愿意相信我们在那里学习了最佳实践,哈哈。

如果有必要,我可以回去尝试找到他指出我应该抛出异常的代码段。但是,就目前而言,我只是想知道我是否应该在代码中使用异常或手动处理事情。关于这一点的最佳实践是什么?

谢谢。


答案 1

仅供参考,我没有在CodeIgniter中使用异常,因为我在Kohana中经常使用它们,只是因为框架抛弃了它们,并且一切都被设计为与CodeIgniter不同的异常工作。使用异常是一种很好的做法,前提是所有类/框架都设计为使用它们。

我不想(真的,不想)进入框架比较讨论,但我需要比较两段代码来澄清你的问题,一段来自CI2,另一段来自Kohana 3(它诞生于CI的一个分支,具有更好的面向对象实现)。

您将看到此 CI2 代码...

try
{
    $result = $this->db->insert('entries', $this->input->post());

    // This is not useful.
    if ( ! $result)
    {
        throw new Exception();
    }
}
catch (Exception $e)
{
    // Do something
}

它不是很有用。与此Kohana 3代码进行比较:

try
{
    $entry = ORM::factory('blog');
    $entry->values(Request::current()->post());
    $entry->save();
}
catch (ORM_Validation_Exception $e)
{
    Session::instance()->set('form_errors', $e->errors(TRUE));
}

你会看到这很有用,你不会引发异常,它是由处理记录保存的类引发的,并且具有所有验证错误。当一切都设计为有例外时,您可以确定这是一个很好的做法,也是一个非常方便的做法。但CI2的情况并非如此,所以也许我应该说继续不使用例外。$e->errors


A possible approach to exceptions in CI...

try
{
    $this->load->model('blog');
    $this->blog->save_entry($this->input->post());   // Handle validation inside the model with the Form_validation library
}
catch (Validation_Exception $e)   // You throwed your custom exception with the failed validation information
{
    // Do something with your custom exception like the kohana example
    $this->session->set('form_errors', $e->errors());
}

我希望一切都是可以理解的,也许有人有另一个有趣的观点和更有效的实现。再见。


答案 2

推荐