note 91159 added to language.exceptions
| From: | ask at nilpo dot com | Date: | Wed, 27 May 2009 19:19:13 +0000 |
| Subject: | note 91159 added to language.exceptions | ||
| Groups: | php.notes | ||
| Request: | Send a blank email to php-notes+get-156091@lists.php.net to get a copy of this message | ||
If you intend on creating a lot of custom exceptions, you may find this code useful. I've
created an interface and an abstract exception class that ensures that all parts of the built-in
Exception class are preserved in child classes. It also properly pushes all information back to the
parent constructor ensuring that nothing is lost. This allows you to quickly create new exceptions
on the fly. It also overrides the default __toString method with a more thorough one.
<?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
private $trace; // Unknown
public function __construct($message = null, $code = 0)
{
if (!$message) {
throw new $this('Unknown '. get_class($this));
}
parent::__construct($message, $code);
}
public function __toString()
{
return get_class($this) . " '{$this->message}' in
{$this->file}({$this->line})\n"
. "{$this->getTraceAsString()}";
}
}
?>
Now you can create new exceptions in one line:
<?php
class TestException extends CustomException {}
?>
Here's a test that shows that all information is properly preserved throughout the backtrace.
<?php
function exceptionTest()
{
try {
throw new TestException();
}
catch (TestException $e) {
echo "Caught TestException ('{$e->getMessage()}')\n{$e}\n";
}
catch (Exception $e) {
echo "Caught Exception ('{$e->getMessage()}')\n{$e}\n";
}
}
echo '<pre>' . exceptionTest() . '</pre>';
?>
Here's a sample output:
Caught TestException ('Unknown TestException')
TestException 'Unknown TestException' in
C:\xampp\htdocs\CustomException\CustomException.php(31)
#0 C:\xampp\htdocs\CustomException\ExceptionTest.php(19): CustomException->__construct()
#1 C:\xampp\htdocs\CustomException\ExceptionTest.php(43): exceptionTest()
#2 {main}
----
Server IP: 64.71.164.2
Probable Submitter: 24.131.71.109
----
Manual Page -- http://www.php.net/manual/en/language.exceptions.php
Edit -- https://master.php.net/note/edit/91159
Del: integrated -- https://master.php.net/note/delete/91159/integrated
Del: useless -- https://master.php.net/note/delete/91159/useless
Del: bad code -- https://master.php.net/note/delete/91159/bad+code
Del: spam -- https://master.php.net/note/delete/91159/spam
Del: non-english -- https://master.php.net/note/delete/91159/non-english
Del: in docs -- https://master.php.net/note/delete/91159/in+docs
Del: other reasons-- https://master.php.net/note/delete/91159
Reject -- https://master.php.net/note/reject/91159
Search -- https://master.php.net/manage/user-notes.php