如何正确处理 PHP 异常

我正在尝试在我的新 PHP 项目中实现自己的异常处理,我还没有遇到任何错误,但我担心我的架构不正确,让我告诉你我的意思。


我目前正在实现一个系统,可以处理某些类型的文件,编写它们,删除它们,创建它们等等,当然,我需要注意很多事情,所以很多事情都可能出错,所以我做了以下结构,但我觉得我重复自己太多了。


所以,我把它作为我的主要异常类,我的所有自定义异常都将扩展:


abstract class PickleException extends Exception implements Throwable

{

    abstract protected function handle () : void;

}

我做了以下两个例外,目前做同样的事情


class DuplicateFileException extends PickleException

{

    public function handle() : void

    {

        echo $this->getMessage();

    }

}


class InvalidCreationDirectoryException extends PickleException

{

    public function handle() : void

    {

        echo $this->getMessage();

    }

}

现在,让我展示一下文件系统是如何组织的。


    FileManager -- Interface


        FileSystem -- Abstract class (Parent)


            PHPManager -- Class (Child)


            YamlManager -- Class (Child)


            XMLManager -- Class (Child)

现在,我知道我可以在这些类中的任何一个中抛出新的异常,但问题取决于我在哪里捕捉它们?到目前为止,我有这样的东西......


abstract class FileSystem implements FileManager

{

    /**

     * Creates an empty file based on the path, name and extension

     * given.

     *

     * @param string $path

     * @param string $name

     * @param string $extension

     * @throws DuplicateFileException

     * @throws InvalidCreationDirectoryException

     * @return void

     */

    final function makeEmptyFile (string $path, string $name, string $extension) : void

    {

        $file = "$path/$name.$extension";


        if (!file_exists($path)) {

            if (!mkdir($path, 0777, true)) {

                throw new InvalidCreationDirectoryException("Error: Impossible to create directory");

            }

        }


        if (file_exists($file)) {

            throw new DuplicateFileException("Warning: File already exists, aborting");

        }


        touch($file);

    }

}

换句话说。捕获我抛出的所有异常的正确位置在哪里?


梵蒂冈之花
浏览 102回答 1
1回答

开心每一天1111

没有一个“正确”的地方可以捕获异常,也没有一种方法可以“处理”它们。理想情况下,您可以在代码中的某个位置捕获它们,在那里您可以实现逻辑来解决原因,例如:重试,或优雅地处理故障,例如:关闭连接并中止。很少有一种万能的解决方案。否则,不要抓住它们。未捕获的异常应该冒泡到全局异常处理程序并被视为致命错误。这是唯一的“一般”情况异常处理程序,PHP 的默认值是致命错误和堆栈跟踪。您可能想要自定义它以将异常记录到磁盘并显示“糟糕,出了点问题”。给用户的消息。像这样的块:try {} catch( \Exception $e ) {    echo $e->getMessage();}或者try {} catch( \Exception $e ) {}相当于将其变成信息警报并忽略它。TL;DR:除非您打算做一些有意义的事情,否则根本不要捕获异常。
打开App,查看更多内容
随时随地看视频慕课网APP