Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP: \Exception or Exception inside a namespace

Tags:

exception

php

I am trying to handle some errors in my api. However I tried some so many ways to execute what it's needed to it done?

In the code i used Exception, \Exception, another class extending to Exception, "use \Exception". None of these options works. What i need to do execute the block catch?

  //Piece of source in the begin of file
    namespace Business\Notifiers\Webhook;
    use \Exception;
    class MyException extends \Exception {}

    //Piece of source from my class
    try{

        $products = $payment->getProducts();
        if(count($products) == 0)
            return;
        $flight_id = $products[0]->flight_id;
        $this->message = 'Sir, we have a new request: ';
        $products = null; //Chagind it to null to force an error..
        foreach($products as $product){

            $this->appendAttachment(array(
                'color' => '#432789',
                'text' => 
                    "*Name:* $product->name $product->last_name \n" . 
                    "*Total Paid:*  R\$$product->price\n",
                'mrkdwn_in' => ['text', 'pretext']
            ));
        }
    } catch(Exception $e){
        $this->message = "A exception occurred ";
    } catch(\Exception $e){
        $this->message = "A exception occurred e";
    } catch(MyException $e){
        $this->message = "A exception occurred";
    } 
like image 864
Guilherme Soares Avatar asked Oct 15 '16 21:10

Guilherme Soares


People also ask

Does throwing an exception stop execution PHP?

When an exception is thrown, the code following it will not be executed, and PHP will try to find the matching "catch" block. If an exception is not caught, a fatal error will be issued with an "Uncaught Exception" message.

Does PHP have try catch?

The primary method of handling exceptions in PHP is the try-catch. In a nutshell, the try-catch is a code block that can be used to deal with thrown exceptions without interrupting program execution. In other words, you can "try" to execute a block of code, and "catch" any PHP exceptions that are thrown.

How do I turn errors into exceptions in PHP?

Converting errors into exception is done by calling set_error_handler() and throw new ErrorException() in there...


Video Answer


2 Answers

The accepted answer above give the real cause of the issue, but did not answer the topic

If in case someone is interested and is looking for

what is the difference between Exception and \Exception inside a namespace?

Still valid against PHP 7.3.5:

  1. \Exception: Refer to Exception in root namespace
  2. Exception: Refer to Exception in current namespace
  3. PHP does not fall back to root namespace, if the class cannot be found in current name space, it emits an error.

<?php
namespace Business;
try {
    throw new Exception("X"); //  Uncaught Error: Class 'Business\Exception' not found
} catch (Exception $e) {
    echo "Exception: " . $e->getMessage();
}

<?php
namespace Business;
class Exception extends \Exception {} // means \Business\Exception extends \Exception

$a = new Exception('hi'); // $a is an object of class \Business\Exception
$b = new \Exception('hi'); // $b is an object of class \Exception
like image 197
Michael Mitch Avatar answered Oct 18 '22 20:10

Michael Mitch


First of all, you need to understand the difference between an exception and an error:

  1. http://php.net/manual/en/language.exceptions.php
  2. http://php.net/manual/en/ref.errorfunc.php

Trying to foreach over a null value will not yield an exception, but trigger an error. You can use an error handler to wrap an error in an exception, as such:

<?php

function handle ($code, $message)
{
    throw new \Exception($message, $code);
}

set_error_handler('handle');

// now this will fail
try {
    $foo = null;
    foreach ($foo as $bar) {
    }
} catch(\Exception $e) {
    echo $e->getMessage();
}

However in your code, you can simply check if $products is null and if so, throw an exception:

if (!$products) {
    throw new \Exception('Could not find any products')
}
foreach($products as $product) { ...
like image 39
motanelu Avatar answered Oct 18 '22 20:10

motanelu