我可以在扩展Exception类中添加什么?

时间:2013-03-06 23:11:37

标签: php error-handling try-catch

我可以在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();
    }

2 个答案:

答案 0 :(得分: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,则可能会覆盖构造函数。

答案 1 :(得分:1)

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

例如,你有一个CustomConfigNotFoundException和一个DatabaseException你可以说我不需要自定义配置因为我可以暂时使用默认但没有数据库你搞砸了...所以你可以使用catch(CustomConfigNotFoundException e )加载默认配置,只要让DatabaseException停止你编程/脚本/页面,无论你使用什么例外。