Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php exceptions extra parameters

Tags:

php

Is it possible to add an extra parameter when throwing an exception?

When I throw an exception I send along the error message but I would also like to send along the name of the field in a extra parameter. Something like:

throw new Exception('this is an error message', 'the field');

So when I display the message I can do something like this:

show_error($e->getFieldname, $e->getMessage());
like image 856
dazz Avatar asked Oct 29 '10 07:10

dazz


People also ask

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.

Can we use catch ()' without passing arguments in it?

Some exception can not be catch(Exception) catched. Below excecption in mono on linux, should catch without parameter. Otherwise runtime will ignore catch(Exception) statment.

What are exceptions in PHP?

An exception is an object that describes an error or unexpected behaviour of a PHP script. Exceptions are thrown by many PHP functions and classes. User defined functions and classes can also throw exceptions. Exceptions are a good way to stop a function when it comes across data that it cannot use.


4 Answers

No, you would have to subclass Exception with your own implementation and add that method.

class FieldException extends Exception
{
    protected $_field;
    public function __construct($message="", $code=0 , Exception $previous=NULL, $field = NULL)
    {
        $this->_field = $field;
        parent::__construct($message, $code, $previous);
    }
    public function getField()
    {
        return $this->_field;
    }
}

But actually, I am not a friend of adding methods or properties to Exceptions. An Exception represents just that: something exceptional that happened in your application. The "field" property is really not part of the Exception, but part of the exception message, so I'd probably use a proper message like:

Wrong value for field foo. Excepted string, got integer

like image 57
Gordon Avatar answered Nov 03 '22 03:11

Gordon


There is no need to add an extra parameter.

You can just throw an Exception like this:

throw new Exception("My Exception Text", 1234);

And access both values:

catch (Throwable $t)
{  
    echo var_dump($t);
    echo "Exception: " . $t->getMessage();
    echo "Code: " . $t->getCode();
}
like image 37
ChrisB Avatar answered Nov 03 '22 02:11

ChrisB


What I do, is have a class to create custom exceptions, but to standardise matters, I simply have one additional argument, which is an object (well, so far it's always been an array), which allows me to specify unlimited amount of exception data (much like a javascript exception).

Output:

Fatal error: Uncaught SqlProxyException 'Duplicate entry '1' for key 'PRIMARY'' in     /usr/src/wrangler/trunk/common/SqlProxy.php(356)
#0 /usr/src/wrangler/trunk/common/SqlProxy.php(341): SqlProxy::Update('INSERT into tes...')
#1 /usr/src/wrangler/trunk/common/SqlProxy.php(455): SqlProxy::Insert('INSERT into tes...')
#2 {main}
Array
(
[sql] => INSERT into test SET test='1'
[errorObject] => Array
    (
        [status] => UNKNOWN
        [data] => Array
            (
                [rowsAffected] => -1
                [errorMsg] => Duplicate entry '1' for key 'PRIMARY'
                [errorCode] => 1062
....

This is achieved by the following in my code:

<? require_once "CustomException.php";

## Define the custom exception
class SqlProxyException extends CustomException {}

## Throw a custom exception
throw new SqlProxyException($errorMsg, $errorCode, null, 
    array("sql" => $query, "errorObject" => $result)
);

## Catch the custom exception

try {
   SqlProxy::Insert($argv[2]);
} catch (SqlProxyException $e) {
   fprintf(STDERR, "Fatal error: Uncaught SqlProxyException '%s' in %s(%s)\n%s\n%s\n",
       $e->getMessage(), $e->getFile(), $e->getLine(),
       $e->getTraceAsString(),
       $e->getObject() ? print_r($e->getObject(), 1) : ""
   );
   exit(1);
}  

Not too difficult... and the magic behind CustomException.php is

<?php

interface IException
{
    /* Protected methods inherited from Exception class */
    public function getMessage();                 // Exception message
    public function getCode();                    // User-defined Exception code
    public function getFile();                    // Source filename
    public function getLine();                    // Source line
    public function getTrace();                   // An array of the backtrace()
    public function getTraceAsString();           // Formated string of trace

    /* Overrideable methods inherited from Exception class */
    public function __toString();                 // formated string for display
    public function __construct($message = null, $code = 0);

}

abstract class CustomException extends Exception implements IException
{ 
    protected $message = 'Unknown exception';     // Exception message
    private   $string;                            // Unknown
    protected $code    = 0;                       // User-defined exception code
    protected $file;                              // Source filename of exception
    protected $line;                              // Source line of exception
    protected $object = null;                     // Extra information in an object (array) js style
    private   $trace;                             // Unknown

    public function __construct($message = null, $code = 0, Exception $previous = null, $eventObject = null)
    {
        if (!$message) {
            throw new $this('Unknown '. get_class($this));
        }
       parent::__construct($message, $code, $previous);
       $this->object = $eventObject;
    }

    public function __toString()
    {
        return get_class($this) . " '{$this->message}' in {$this->file}({$this->line})\n"
                                . "{$this->getTraceAsString()}";
    }

   /* Additional custom method */
   public function getObject()                   // Return object (array) of extra info (js style)
   {
      return $this->object;
   }
}
like image 21
Orwellophile Avatar answered Nov 03 '22 03:11

Orwellophile


You can implement your own Exception class, and customize it.

See Extending Exceptions article for details.

like image 43
Kel Avatar answered Nov 03 '22 04:11

Kel