是否有可能有Try/Catch抛出与多个异常


Is it possible to have Try/Catch Throw with multiple exceptions

我有以下代码,我想知道我是否可以使用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的结构是否有效

你只能捕获不同类型的异常…

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块中实例化你的类

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

你可以把每个可能抛出异常的代码包装在自己的try-catch块中。

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

可以在程序中的某个点抛出异常(如果未捕获异常,则不能在异常之后抛出)。

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

你可以在你的整个程序或者只是一个函数周围做一个try catch

可以抛出不同类型的异常:

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

,然后捕捉不同的异常:

try {
    // something
}
catch (ConnectException $ex) {
    // connect exception
}
catch (QueryException $ex) {
    // query exception
}

这是不可能的,因为当你抛出

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

这个异常将被捕获在这一行

catch(Exception $err){
    echo "This Problem at:". $err->getMessage();
}
如果第一个异常被抛出
,你将不会到达可以抛出另一个异常的行