除了成功以外的其他任何类别抛出异常,它是一个好的练习/编程形式吗?

时间:2013-10-13 14:46:18

标签: php class oop coding-style open-source

我正在编写一些类,并想知道如何正确处理不成功的场景。例如,文件上载类,作为参数接受$ _FILES资源的名称:

class FileUpload {
    private $file;

    public function __construct($file) {
        $this->file = $file;
    }

    public function upload() {
        if (!isset($_FILES[$this->file])) { 
            throw new Exception("Reference to non existent resource.");
        }

        if ($_FILES[$this->file]['error'] !== 0) { 
            throw new Exception("Resource indicates error.");
        }

                // All other sorts of checks here, like security checks,
                // and then finally moving of the file to it's final destination
    }
}

这是正确的形式吗?我的想法是这样的:当开发人员创建一个新的FileUpload实例时,他的意图是上传文件,或者知道为什么没有上传,这个类就会给他这个。之一:

1)true(文件已经过测试,格式正确,安全检查,如果是图像,甚至可以进一步处理,现在它正是您想要的位置。简而言之 - 您想要的所有内容都已制定出来)

2)异常(出了问题,而且消息让你知道究竟是什么,所以你可以处理它。)

如果这一切都很好,我应该只使用Exception,使用自定义消息,还是为所有内容创建自定义异常,例如WrongMimeType?

如果重要 - 课程将是开源的,供所有人使用,因此从这方面来说,我也希望将它们作为标准化,开发人员友好型并尽可能轻松插入现有软件。

1 个答案:

答案 0 :(得分:1)

这可能会移到codereview,因为它在我看来就是一个关于编码风格的问题。

然而:

您的upload()方法设计糟糕。它应该接受一个参数,而不是从$_FILES获取数据 - 外部用户应该将它传递给函数。通常不应该从超全局变量或全局变量中获取数据。

尊重这一点,驳回了抛出异常的第一个理由。 :)

然后呢?很难进一步讨论细节,因为没有太多的代码可以看,所以我回到一般性的评论:

不应将例外用作goto的替代品。他们应该发出无法预料的异常状态。

在验证表单时,无效表单数据不是无法预料的异常状态 - 这是两种常见情况之一。实际上,您正在验证类中的表单数据 - 如果表单无效,则不应抛出异常。

另一件事:不要隐藏异常消息中出错的东西。如果我不能捕获使用多个catch语句抛出的不同异常类,那么使用该类会变得更加困难,但是必须查看消息。

并且因为您要求将该代码用于其他人:使用命名空间,PSR-0兼容自动加载和您自己的异常类。并且不要从超全球中获取数据。