1

我有以下代码,我想知道是否可以使用 try & catch 如下:

class fun_database implements idbInfo{
    private $srvr=idbInfo::srvr_name;
    private $usr=idbInfo::usrnm;
    private $pass=idbInfo::psswrd;
    private $db=idbInfo::db_name;

    public function connct(){
        $hookup = new mysqli($this->srvr, $this->usr, $this->pass, $this->db);

        if ($hookup->connect_errno)     
        {
            throw new Exception("Error Processing Request", 1);
        }
    }

    public function sql_require_all($table_name, $table_col){
        $hookup = new connct();

        $result = $hookup->query("SELECT $table_col FROM $table_name");
            if($hookup->error()){
               throw new Exception("Error Processing Request", 1);
            }
        return $result->num_rows;
    }
}

这是一个到 mysql 的简单连接并在那里执行一些查询。这是上面函数的实际调用:

$conn = new fun_database();
    try{
        $result = $conn->sql_require_all('wordtypes', 'types');
    }
    catch(Exception $err){
        echo "Problems at:". $err->getMessage();
    }
    return "<option>".$result."</option>";

我要问的是有点理论。很可能这段代码不起作用(我还没有测试它)。我只是想知道一个“尝试”是否有可能“捕获”两个异常(如您所见,第一个“抛出”在 fun_database 的第二种方法中,第二个“抛出”在第一种方法中仅从第二种方法调用的相同对象)。

抱歉让它太复杂了,但仍然无法弄清楚这个 try/catch 结构是否有效。

4

6 回答 6

5

您只能捕获不同类型的异常...

class fun_database implements idbInfo{
private $srvr=idbInfo::srvr_name;
private $usr=idbInfo::usrnm;
private $pass=idbInfo::psswrd;
private $db=idbInfo::db_name;

public function connct(){
    $hookup = new mysqli($this->srvr, $this->usr, $this->pass, $this->db);

    if ($hookup->connect_errno)     
    {
        throw new DomainException("Error Processing Request", 1);
    }
}

public function sql_require_all($table_name, $table_col){
    $hookup = new connct();

    $result = $hookup->query("SELECT $table_col FROM $table_name");
        if($hookup->error()){
           throw new Exception("Error Processing Request", 1);
        }
    return $result->num_rows;
}
}

然后:

try{
    $conn = new fun_database();
    $result = $conn->sql_require_all('wordtypes', 'types');
}
catch(DomainException $err){
    echo "This Problem at:". $err->getMessage();
}
catch(Exception $err){
    echo "That Problem at:". $err->getMessage();
}
return "<option>".$result."</option>";

尽管我相信,您需要在该 try 块中进行类实例化。

于 2013-05-24T08:23:15.467 回答
2

它不会捕获这两个异常,因为一旦抛出第一个异常,它就会直接进入 catch 块,从而直接跳过第二个异常。

您可以将每个可能引发异常的代码包装在它自己的 try-catch 块中。

于 2013-05-24T08:22:38.857 回答
2

是和不是。您的代码能够捕获其中两个异常,但不能同时捕获两个异常。当一个异常将被抛出时,程序执行将寻找最接近的 catch 块,它适合于 catchException类。其余代码将被省略。

于 2013-05-24T08:23:58.847 回答
1

您可以抛出不同类别的异常:

class ConnectException extends Exception {}
class QueryException extends Exception {}

然后捕获不同的异常:

try {
    // something
}
catch (ConnectException $ex) {
    // connect exception
}
catch (QueryException $ex) {
    // query exception
}
于 2013-05-24T08:24:57.913 回答
1

您可以在程序中的某个点抛出异常(如果没有被捕获,则不会在异常之后)。

一旦达到这一点,它将停止并尝试回退到 a try catch 块。一旦它找到一个它就会执行这个块(如果它是一个很好的捕获)

您可以尝试捕获整个程序或只是一个函数。

于 2013-05-24T08:21:33.510 回答
1

这是不可能的,因为当你扔

throw new Exception("Error Processing Request", 1);

此异常将在此行中捕获

catch(Exception $err){
    echo "This Problem at:". $err->getMessage();
}

如果抛出第一个异常,您将无法到达可以抛出另一个异常的行

于 2013-05-24T08:25:45.673 回答