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>";

私が求めているのは少し理論です。ほとんどの場合、このコードは機能していません (まだテストしていません)。1 つの「try」で 2 つの例外を「キャッチ」できるかどうかを知りたいだけです (ご覧のとおり、最初の「throw」は fun_database の 2 番目のメソッドにあり、2 番目の「throw」は最初のメソッドにあります。 2 番目のメソッドからのみ呼び出される同じオブジェクト)。

複雑すぎて申し訳ありませんが、この try/catch の構造が機能していることをまだ理解できません。

4

6 に答える 6

2

はいといいえ。コードはこの例外のうち 2 つをキャッチできますが、両方を同時にキャッチすることはできません。Exception例外の 1 つがスローされると、プログラムの実行は、catchクラスに適合する最も近い catch ブロックを探します。残りのコードは省略します。

于 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

プログラムのある時点で例外をスローできます (キャッチされない場合、例外の後ではありません)。

このポイントに達するとすぐに停止し、try catch ブロックにフォールバックしようとします。見つけ次第、このブロックを実行します (うまくキャッチできた場合)。

プログラム全体または関数だけで try catch を作成できます。

于 2013-05-24T08:21:33.510 に答える