如何使用该类从脚本中“捕获”类中的已处理异常?

时间:2017-07-24 06:47:08

标签: php

我有一个看起来像这样的脚本:

require ("class-pdowrapper.php");
$db = new DB();

$baddata = 'abc'; //should be an integer!!

$db->bind("myinteger", $baddata);
$sql = "INSERT INTO t_numbers (theinteger) VALUES (:myinteger)";
$result = $db->query($sql);

if ($result == 1) {
    echo "success.";
} else {
    echo "didn't work..."; //question relates to this line
}

如果$baddata是“abc”,即一个字符串,该类将处理异常并输出如下内容:

  

未处理的例外。   SQLSTATE [HY000]:常规错误:1366不正确的整数值:第1行的'theinteger'列的'abc'   您可以在日志中找到错误

该课程通过以下方式实现:

private function query($statement) {
    try {
        // stuff
    }
    catch (PDOException $e) {
        echo $this->ExceptionLog($e->getMessage(), $query);
        die();
    } 
}



private function ExceptionLog($message, $sql = "") {
        $exception = 'Unhandled Exception. <br />';
        $exception .= $message;
        $exception .= "<br /> You can find the error back in the log.";

        if (!empty($sql)) {
            $message .= "\r\nRaw SQL : " . $sql;
        }
        return $exception;
}

所以问题是,脚本如何确认在类中抛出和处理的异常并使用知识做某事。在我的情况下,我可以向用户显示错误或通过电子邮件发送给管理员,以显示某些内容与数据库相关的代码无效。

3 个答案:

答案 0 :(得分:0)

在将所有变量发送到服务器之前,需要对其进行验证 这是正确的方式,因为你没有向服务器端发送错误的请求。

像这样(它只是样本)

<?php

class sampleClass 
{

    public function __construct($data) {

        if ($this->validateData($data)) {
            //do something
            $this->runRequest($data);
        } else {
            //parse errors
            //var_dump($data);
        }
    }

    private function validateData($data) {

        foreach($data as $currentData) {

            if ($currentData['type'] == 'integer' && is_int($currentData['value'])) {
                return false;
            }

            if ($currentData['type'] == 'string' && is_string($currentData['value'])) {
                return false;
            }

        }

        return true;
    }

    private function runRequest($data) {
    }

}

$data = [
    'correct_age' => [
        'type' => 'integer',
        'value'  => 88
        ],
    'incorrect_age' => [
        'type'  => 'integer',
        'value'  => 'abc'
        ],
    'incorrect_name' => [
        'type' => 'string',
        'value' => 111
        ]
    ];

$test = new sampleClass($data);

答案 1 :(得分:0)

这里有很多选择。以下是其中一些:

  1. 您可以在catch (PDOException $e) {块中重新抛出异常,并在脚本中再创建一个try ... catch ...。因此,您将处理query方法中的日志记录,然后在脚本文件本身中处理与应用程序相关的逻辑:

    try {  
       $result = $db->query($sql);
    } catch (AnotherException $e) {
       ...
    }
    
  2. 您可以从query()返回复杂的结果,就像这样(它只是一个草稿):

    $result = array(
        'status' => true|false (or 'error' => true|false),
        'data'   => ... (valid data on success, error details data on error)
    )
    

    然后你可以毫无问题地处理这个结果。

答案 2 :(得分:0)

如果你发现异常,那么它就会停止向上移动,所以你没有机会“重新捕捉它”。

基本上你可以通过创建一个自定义错误类型来重新抛出一个自定义类型的异常:

class DataInsertException extends Exception {}

而不是以后:

try {
    // stuff
}
catch (PDOException $e) {
    echo $this->ExceptionLog($e->getMessage(), $query);
    throw new DataInsertException();
}

这样你就可以“过滤”try catch语句中的异常:

try {} catch (DataInsertException $error) {} 

每当你处理数据库时。所有其他错误都不会被该块捕获。

或者您也可以在$errors课程中添加DB媒体资源。

class DB {
  private $errors;

  public function __construct(){
    $this->errors = [];
  }

  public function insert(){
    try {}
    catch($error) {
      array_push($this->errors, $error);
    }
  }

  public function getErrors() {
    return $this->errors;
  }
}

这样,你可以检查每个事务后的$db对象是否有错误并对此作出反应。

我更喜欢自定义错误