PHP:级联中捕获异常。可能吗?

时间:2011-03-15 16:23:53

标签: php exception error-handling try-catch cascade

我真的需要你的帮助......

如何在级联中捕获异常? 我有一个函数(A)调用另一个文件(B)中的另一个函数调用另一个文件(C)中的另一个函数。 如何进入函数A的函数C,函数C的错误? 可能吗? 看下面我的例子......我试着尽可能清楚......

// This code is in a file ( file A ) that call a function of a file B
    require_once('/User_Login.php');

    try
    {
        CREATE_NEW_User_Login(arr_Test, 'hello');
        return true;
    }
    catch(Exception $e)
    {
        echo $e->getMessage();
        return false;
    }
}





// This code is in another file ( file B ) that call a function of a file C
public function CREATE_NEW_User_Login($_INPUT_Array = null, $_INPUT__Password = null)
{

    // Db connection...


    require_once('/User__DBclass.php');
    $DBCl_User = new User($DBConn, null);
    $DBCl_User->SET__CLASS_ATTRIBUTES_Value__by_Array($_INPUT_Array);
    $DBCl_User->SETTER__user_pass(md5($_INPUT__Password));

    $this->config['mysqli']->beginTransaction();

    try
    {
        $DBCl_User->INSERT__NEW_ROW())
        return true;
    }
    catch(Exception $e)
    {
        echo $e->getMessage();
        return false;
    }
}




// This code is in another file ( file C )
// In the User Class ( file: User__DBclass.php )
public function INSERT__NEW_ROW()
{
    $this->config['stmt'] = $this->config['mysqli']->prepare('INSERT INTO tbl_user
                                                                      SET user_id = :user_id,
                                                                          user_name = :user_name,
                                                                          act_code = :act_code;');


    $this->config['stmt']->bindParam(':user_id', $this->user_id, PDO::PARAM_INT);
    $this->config['stmt']->bindParam(':user_name', $this->user_name, PDO::PARAM_STR);
    $this->config['stmt']->bindParam(':act_code', $this->act_code, PDO::PARAM_STR);


    try
    {
        $this->config['stmt']->execute();
        $this->user_id = intval($this->config['mysqli']->lastInsertId());
        return $this->user_id;
    }
    catch(PDOException $e)
    {
        echo $e->getMessage();
        return false;
    }
}

3 个答案:

答案 0 :(得分:2)

这是Exception的基本组合:如果你没有直接捕获异常,那么这个异常会被抛到upper元素,依此类推到“Root script”。

注意,您必须捕获异常,否则您将收到错误。

您还可以“重新”从catch块中抛出异常,如下所示:

catch(PDOException $e) {
    throw $e;
}

答案 1 :(得分:2)

如果你想级联异常,那么你需要再次抛出它们而不是只返回false。

您可以为每个异常创建一个新的异常类型,也可以创建一般异常并设置相应的消息和代码。

 catch(Exception $e)
 {
    //do something here if you want
    throw $e;
 }

参考:http://php.net/manual/en/language.exceptions.php

答案 2 :(得分:1)

只是不要在抛出它的函数中捕获异常。然后它会被你的调用函数捕获。