PHP捕获致命错误并重定向

时间:2013-05-29 14:12:40

标签: php try-catch fatal-error

有时我会在这一行中出现致命错误

$result = $db->execute($query);

$primary = $result->getRows();

致命错误:在非对象上调用成员函数getRows()

我正在寻找解决方案以捕获此错误并重定向到索引页。

重写一些东西很复杂,因为系统很旧。

6 个答案:

答案 0 :(得分:1)

这样的事情:

$result = $db->execute($query);

if ($result===false) {
    header("Location: errorpage.php");
    exit;
}
$primary = $result->getRows();

答案 1 :(得分:1)

首先,不管怎样都不应该出错。

您必须修复代码才能更正错误,而不是编写新代码来处理错误。

从DB中获取错误消息,以查看导致此错误的特定问题并进行修复。

另外

  • 一般来说,你无法发现致命的错误。
  • 您不应该在任何地方重定向。如果出现错误,则必须返回“503 HTTP标头”以及通用503页。

答案 2 :(得分:0)

这里的问题是execute()在某些情况下会返回FALSE,而boolean不是结果对象。

为了避免这个错误,你应该总是检查execute()的输出,如果它甚至成功执行。

例如:

$result = $db->execute($query);

if ($result !=== false) {
 $primary = $result->getRows();
}

答案 3 :(得分:0)

我们需要知道$ db是什么,你没有包含初始化$ db的代码,或者告诉我们这是什么引用。

假设您正在使用PDO库,PDO对象本身具有PDO :: exec(),PDOStatement对象具有PDOStatement :: execute()。因此,我假设$ db是PDOStatement的一个实例,并且您正在调用execute()方法,该方法在失败时返回boolean,false并在成功时返回true - 它在成功时不返回对象。如果成功,则应调用$ db-> fetchAll();

if (!$db->execute($query)) {
    header("Location: error.php");
    exit;
} 

$rows = $db->fetchAll();

答案 4 :(得分:0)

通常情况下,您无法捕获错误...只有异常....幸运的是,您可以设置一个错误处理程序,它会抛出异常。 (来自对php ErrorException页面的评论)

class ErrorHandler extends Exception {
    protected $severity;

    public function __construct($message, $code, $severity, $filename, $lineno) {
        $this->message = $message;
        $this->code = $code;
        $this->severity = $severity;
        $this->file = $filename;
        $this->line = $lineno;
    }

    public function getSeverity() {
        return $this->severity;
    }
}

function exception_error_handler($errno, $errstr, $errfile, $errline ) {
    throw new ErrorHandler($errstr, 0, $errno, $errfile, $errline);
}

set_error_handler("exception_error_handler", E_ALL);

因此,针对您的具体问题,您可以这样做:

try{
    $result = $db->execute($query);
    $primary = $result->getRows();
} catch (ErrorHandler $e){
    header("Location: /index.php");
    exit;
}

答案 5 :(得分:-1)

如果您收到错误消息“已发送标头”,那是因为已经输出了某些内容。例如:

echo "hello world;";
header("Location: errorpage.php");

或:

 <?php // notice the space before <?php 
header("Location: errorpage.php");
?>