我正在编写一些类,并想知道如何正确处理不成功的场景。例如,文件上载类,作为参数接受$ _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?
如果重要 - 课程将是开源的,供所有人使用,因此从这方面来说,我也希望将它们作为标准化,开发人员友好型并尽可能轻松插入现有软件。
答案 0 :(得分:1)
这可能会移到codereview,因为它在我看来就是一个关于编码风格的问题。
然而:
您的upload()
方法设计糟糕。它应该接受一个参数,而不是从$_FILES
获取数据 - 外部用户应该将它传递给函数。通常不应该从超全局变量或全局变量中获取数据。
尊重这一点,驳回了抛出异常的第一个理由。 :)
然后呢?很难进一步讨论细节,因为没有太多的代码可以看,所以我回到一般性的评论:
不应将例外用作goto
的替代品。他们应该发出无法预料的异常状态。
在验证表单时,无效表单数据不是无法预料的异常状态 - 这是两种常见情况之一。实际上,您正在验证类中的表单数据 - 如果表单无效,则不应抛出异常。
另一件事:不要隐藏异常消息中出错的东西。如果我不能捕获使用多个catch语句抛出的不同异常类,那么使用该类会变得更加困难,但是必须查看消息。
并且因为您要求将该代码用于其他人:使用命名空间,PSR-0兼容自动加载和您自己的异常类。并且不要从超全球中获取数据。