【问题标题】:What can I put in the extend Exception class?我可以在扩展异常类中添加什么?
【发布时间】:2013-03-06 23:11:36
【问题描述】:

我可以在extend Exception 类中添加什么以及如何使用它?如您所见,我在catch 块中包含了错误处理。

例如:

class Manager {

    private $socket = null;

    private $config = array();

    public function connect($host = null, $port = null) {

        if ($host == null || $port == null) {
            throw new PortHostNotGivenException('Host or Port is missing');
        }

        $this->socket = fsockopen($host,$post);

    }
}


class PortHostNotGivenException extends Exception {
    // What to put here??
 } 

测试:

$ast = new Manager();

    try {
      $ast->connect();
    } catch (PortHostNotGivenException $e) {
       // Log Error to File
       // Log Error to Linux Console
       echo $e . '/r/n';
       exit();
    }

【问题讨论】:

    标签: php error-handling try-catch


    【解决方案1】:

    您可以捕获多个不同的异常并区别对待它们,例如

    try {
        $this->db->save();
    } catch (ConnectionException $e) {
        if ($this->db->reconnect()) {
            // try again
        } else {
            throw new CannotReconnectException();
        }
    } catch (ValidationException $e) {
        // display validation error messages
    } catch (Exception $e) {
        // save failed with a general or unexpected error
    }
    

    您还可以静默处理预期错误,同时不干扰意外错误:

    try {
      ...
    } catch (VendorApiException $e) {
        return false;
    }
    

    在上面的示例中,如果抛出 VendorApiException - 代码将返回 false。如果抛出任何其他异常 - 此catch 块将不会捕获它,而是冒泡。如果没有更高的 try/catch 块,它将由进程 exception handler 处理。

    用户定义的异常主体

    // 这里放什么??

    任何东西或什么都没有——如果你没有理由覆盖任何exceptions properties——不要在里面放任何东西。通常你可以定义一个codemessage,如果你传递一个不是字符串的$message,可能会覆盖构造函数。

    【讨论】:

    • 我想我会在每个catch 中重复相同的代码,例如:将错误记录到文件、将错误记录到 Linux 控制台等。DRY 方法的最佳方法是什么。
    • @I'll-Be-Back 如果您所做的只是记录异常,请不要捕获它们。相反,让它们冒泡到您的顶级异常处理程序(您可以使用set_exception_handler 设置)并将其记录在那里。 IMO,只有在可恢复的情况下才应捕获异常。如果没有,您的应用程序应该正常停止(带有漂亮的警告页面),否则您将面临更大的问题
    • @ColinMorelli PHP 脚本将在 Linux 的后台进程中运行 - 所以我正在寻找处理这种错误处理的好解决方案。
    • @I'll-Be-Back 同样,正如我和 AD7 所提到的,除非您可以恢复,否则只需使用全局异常处理程序。
    • @I'll-Be-Back 长时间运行的进程和 php 不能很好地结合在一起。编写您的代码来处理您知道它可以处理的内容 - 并使用例如运行/管理您的守护进程。 supervisor 以便在(何时)死亡时重新启动进程。如果您使用的是数据库,请预测并考虑连接超时 =)
    【解决方案2】:

    你不需要在那里放任何东西。扩展和异常的目的主要是“过滤”你正在捕获的异常。

    例如,您有一个 CustomConfigNotFoundException 和一个 DatabaseException,您可以在其中说我不需要自定义配置,因为我暂时可以使用默认配置,但是如果没有数据库,您就搞砸了...所以您可以使用 catch(CustomConfigNotFoundException e ) 加载默认配置,让 DatabaseException 停止你的程序/脚本/页面,无论你使用你的异常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 2012-10-03
      • 2018-10-15
      相关资源
      最近更新 更多