我正在构建一个自定义异常类来管理所有异常:
class MyExceptions extends Exception
{
public function __construct($message = 'Unkown errror', $code = -1, Exception $previous = null) {
echo 'init!';
parent::__construct($message, $code, $previous);
}
}
现在,当发生PDOException时,我想将其重新抛出到MyExceptions:
class myDB
{
private $db;
public function dbConnect() {
try {
$this->db = new PDO('mysql:host=localhost;dbname=db;charset=utf8', 'user', 'pass');
}
catch (PDOException $e) {
throw new MyExceptions($e);
}
/* Updated */
catch (MyExceptions $e) {
echo 'caught!';
}
}
}
问题是当数据库连接异常上升时,屏幕上出现以下致命错误:
init!
Fatal error: Uncaught exception 'MyExceptions' with message...
因此,虽然调用了MyExceptions __construct(),但未捕获异常(请参阅显示的'init!')。 我读到的每一点资源都指向我的确切实现,我不知道我做错了什么。
答案 0 :(得分:3)
你需要
try {
try {
$this->db = new PDO('mysql:host=localhost;dbname=db;charset=utf8', 'user', 'pass');
} catch (PDOException $e) {
throw new MyExceptions($e);
}
} catch (MyExceptions $f) {
echo 'caught!';
}
顺序catch块用于try中抛出的不同类型的异常。
答案 1 :(得分:1)
你扔了它:
throw new MyExceptions($e);
^^^^^
然后你没有抓住它。那你觉得怎么样?
此外,你应该在第三个位置(对于前一个)而不是第一个位置(对于消息)添加先前的异常。
答案 2 :(得分:1)
它没有通过所有的catch块。只有匹配的第一个。如果然后在catch块中抛出另一个异常,则必须在第一个块中的另一个try块中捕获它。