I wrote a database wrapper class to help with queries and I'm trying to figure the best way to implement try-catch blocks.
In my database class, I have a helper function;
public function fetchAll($sql, $bind = array()) { $stmt = $this->query($sql, $bind); $result = $stmt->fetchAll($this->_fetch_mode); return $result; } that I can call outside of the class:
$this->db->fetchAll($sql,[$var1,$var2]); My question is where to put the try-catch blocks. It would be "easier" if I just put them inside of my database class:
public function fetchAll($sql, $bind = array()) { $stmt = $this->query($sql, $bind); try { $result = $stmt->fetchAll($this->_fetch_mode); } catch (PDOException $e) { //log the error...give some message } return $result; } instead of wrapping each call to the database class:
try { $this->db->fetchAll($sql,[$var1,$var2]); } (catch PDOException $e) { //log the error...give some message } However, my feeling (without being able to come up with a concrete example...) is that even though it would be more work to wrap each call to the database class, if I do hard code the try-catch block in my database class, it won't be as flexible in terms of handling errors.
Or, would it be better to have a "catch-all" in my index.php (I use MVC) to catch general exceptions (for example, PDO related), and then if I need more specific ones in my application (for example, those thrown when connecting to 3rd party services), then add additional try-block catches for them:
In my index.php, which all requests pass through via my .htaccess file:
try { $db = new Db(); $db->connect(['host'=>DB_HOST,'dbname'=>DB_NAME,'username'=>DB_USERNAME,'password'=>DB_PASSWORD]); $bootstrap = new Bootstrap(); $bootstrap->setControllerPath('application/controllers'); $bootstrap->setModelPath('application/models'); $bootstrap->init(); //load the controller/model/classes } (catch Exception $e) { //log error //if ajax request return json_encoded message other redirect to error page }