0

我正在写一些课程,想知道如何正确处理不成功的场景。例如,一个文件上传类,它作为参数接受 $_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) 异常(出现问题,消息让您确切知道发生了什么,因此您可以处理它。)

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

如果重要的话 - 类将是开源的,可供所有人使用,所以从这方面来说,我也想让它们标准化、对开发人员友好并且尽可能容易地插入现有软件。

4

1 回答 1

1

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

然而:

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

尊重这消除了引发异常的第一个原因。:)

进而?进一步讨论细节有点困难,因为没有太多代码可看,所以我回到一般评论:

不应使用异常来替代goto. 它们应该发出无法预料的异常状态。

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

另一件事:不要在异常消息中隐藏出错的内容。如果我无法捕获使用多个 catch 语句抛出的不同异常类,那么使用该类会变得非常困难,但必须查看消息。

并且因为您正在询问如何使该代码对其他人可用:使用命名空间、与 PSR-0 兼容的自动加载和您自己的异常类。并且不要从超全局变量中获取数据。

于 2013-10-13T17:44:17.450 回答