views:

533

answers:

4

Hello,

I have come accross to this function below and I am wondering wether this is the right way of using the error handling of try/catch.

public function execute()
{
 $lbReturn = false;
 $lsQuery = $this->msLastQuery;
 try
 {
  $lrResource = mysql_query($lsQuery);

  if(!$lrResource)
  {
   throw new MysqlException("Unable to execute query: ".$lsQuery);
  }
  else
  {
   $this->mrQueryResource = $lrResource;
   $lbReturn = true;
  }

 }
 catch(MysqlException $errorMsg)
 {
  ErrorHandler::handleException($errorMsg);
 }
 return $lbReturn;
}
+4  A: 

No. Throwing an exception in this case is simply a GOTO, but with a (slightly) prettier face.

Visage
Why the downvote?
Thomas Padron-McCarthy
A: 

Well it is not really a good implementation since you throw the exception and you look for that exception in catch. So the answer of Visage is true.

  1. You should use a global error handler instead of a tr-catch usage like in your code.
  2. If you are not sure of the type of the error and occurance but want to continue the execution of the code although an exception had occured, then a try-catch block will help.
BYK
+5  A: 

Codewise it is correct/works, However the power of try-catch is that when an Exception is thrown from deep down in one of the functions you're calling.
Because of the "stop execution mid-function and jump all the way back to the catch block".

In this case there are no deep-down exceptions therefore I would write it like this:
(Assuming there is a function "handleErrorMessage" in the ErrorHandler.)

public function execute() {
    $lsQuery = $this->msLastQuery;
    $lrResource = mysql_query($lsQuery);

    if(!$lrResource) {
         ErrorHandler::handleErrorMessage("Unable to execute query: ".$lsQuery);
         return false;
    }
    $this->mrQueryResource = $lrResource;
    return true;
}

Which I find more readable.

Bob Fanger
Thanks for your commment.What would be if I would replace ErrorHandler::handleErrorMessage($errorMsg); with the throw statement?Would that be incorrect?
sanders
That would cause the function execute() to be aborted and jump to a catch block(if any) outside of the execute function. Which dramatically changes the behaviour of the function. If this new behaviour is "incorrect" is up to you.
Bob Fanger
+2  A: 

Why have a call to ErrorHandler::handleException here anyway?

Just throw the exception, but never catch it. Then in the global initialization code for your app have a function with the following signature:

function catchAllExceptions(Exception $e)

Then call:

set_exception_handler('catchAllExceptions');

This will cause all uncaught excpetions to be passed as an argument to catchAllExceptions(). Handling all uncaught exceptions in one place like this is good, as you reduce code replication.