为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确处理 PHP 异常

如何正确处理 PHP 异常

PHP
梵蒂冈之花 2022-07-02 15:49:04
我正在尝试在我的新 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);    }}换句话说。捕获我抛出的所有异常的正确位置在哪里?
查看完整描述

1 回答

?
开心每一天1111

TA贡献1836条经验 获得超13个赞

没有一个“正确”的地方可以捕获异常,也没有一种方法可以“处理”它们。


理想情况下,您可以在代码中的某个位置捕获它们,在那里您可以实现逻辑来解决原因,例如:重试,或优雅地处理故障,例如:关闭连接并中止。很少有一种万能的解决方案。


否则,不要抓住它们。未捕获的异常应该冒泡到全局异常处理程序并被视为致命错误。这是唯一的“一般”情况异常处理程序,PHP 的默认值是致命错误和堆栈跟踪。您可能想要自定义它以将异常记录到磁盘并显示“糟糕,出了点问题”。给用户的消息。


像这样的块:


try {} catch( \Exception $e ) {

    echo $e->getMessage();

}

或者


try {} catch( \Exception $e ) {}

相当于将其变成信息警报并忽略它。


TL;DR:除非您打算做一些有意义的事情,否则根本不要捕获异常。


查看完整回答
反对 回复 2022-07-02
  • 1 回答
  • 0 关注
  • 101 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信