Ale
Ale

Reputation: 1032

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

i have the following code and i'm wondering if i can use try & catch as below:

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

This is a simple connection to the mysql and performing some querying there. Here is and the actual call of the functions above:

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

What i'm asking is a bit theory. Most probably this code is NOT WORKING (i didn't test it yet). I just want to know is it possible with one 'try' to 'catch' two exceptions (as you can see the first 'throw' is in the second method of fun_database, and the second 'throw' is in the first method of the same object which is only called from the second method).

sorry for making it too complicated but still can't figure it out id this structure of try/catch is working.

Upvotes: 1

Views: 1716

Answers (6)

Robert
Robert

Reputation: 20286

It is not possible because when you throw

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

this exception it will be caught in this line

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

you will not reach the line that can throw the other exception if first exception was thrown

Upvotes: 1

cmbuckley
cmbuckley

Reputation: 42458

You can throw different classes of exceptions:

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

and then catch different exceptions:

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

Upvotes: 1

Kasyx
Kasyx

Reputation: 3200

Yes and no. Your code is able to catch two of this exceptions but not both of them at the same time. When one of exception will be thrown, program execution will look for closest catch block, which fits to catch Exception class. Rest of code will be omitted.

Upvotes: 2

Ian Wood
Ian Wood

Reputation: 6573

you can only catch different types of exception...

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

Then:

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

you would need your class instantiation inside that try block though I believe.

Upvotes: 5

Phil Cross
Phil Cross

Reputation: 9302

It wouldn't catch the two exceptions because as soon as the first exception is thrown, it goes straight to the catch block, thereby skipping the second exception directly.

You could wrap each code which may throw an exception in its own try-catch block.

Upvotes: 2

MKroeders
MKroeders

Reputation: 7762

You can throw an exception at an point in the program (not after an excpetion if it is not caught).

As soon as it hits this point it will stop and try to make the fallback to the a try catch block. As soon as it finds one it will do this block (if it is a good catch)

You could make a try catch around your entire program or just a function.

Upvotes: 1

Related Questions