From 599fba0d5fc91500e4767d520fec2baff24904d2 Mon Sep 17 00:00:00 2001 From: Curt Zirzow <curt@php.net> Date: Sat, 21 Aug 2004 02:43:56 +0000 Subject: [PATCH] The overdue exception documentation. git-svn-id: https://svn.php.net/repository/phpdoc/en/trunk@166940 c90b9560-bf6c-de11-be94-00142212c4b1 --- language/oop5/exceptions.xml | 196 ++++++++++++++++++++++++++++++++++- 1 file changed, 194 insertions(+), 2 deletions(-) diff --git a/language/oop5/exceptions.xml b/language/oop5/exceptions.xml index 17a7ee57eb..5cd69aa1cc 100644 --- a/language/oop5/exceptions.xml +++ b/language/oop5/exceptions.xml @@ -1,11 +1,203 @@ <?xml version="1.0" encoding="iso-8859-1"?> -<!-- $Revision: 1.1 $ --> +<!-- $Revision: 1.2 $ --> <sect1 id="language.oop5.exceptions"> <title>Exceptions</title> <para> - . + PHP5 has an exception model similar to that of other programming languages. + An exception can be thrown, try and caught within PHP. A Try block must + include at least one catch block. Multiple catch blocks can be used to + catch different classtypes; execution will continue after that last catch + block defined in sequence. Exceptions can be thrown within catch blocks. </para> + <para> + When an exception is thrown, code following the statement will not be + executed and PHP will attempt to find the first matching catch block. If an + exception is not caught a PHP Fatal Error will be issued with an Uncaught + Exception message, unless there has been a handler defined with + <function>set_exception_handler</function>. + </para> + <example> + <title>Throwing an Exception</title> + <programlisting role="php"> +<![CDATA[ +<?php +try { + $error = 'Always throw this error'; + throw new Exception($error); + + // code following an execption isn't executed. + echo 'Never executed'; +} +catch (Exception $e) { + echo "Caught exception: ", $e, "\n"; +} + +/* continue execution */ +?> +]]> + </programlisting> + </example> + + <sect2 id="language.oop5.execptions.extending"> + <title>Extending Exceptions</title> + <para> + A User defined Exception class can be defined by extending the built-in + Exception class. The members and properties below, show what is accessible + within the child class that derives from the built-in Exception class. + </para> + <example> + <title>The Built in Exception class</title> + <programlisting role="php"> +<![CDATA[ +<?php +class Exception { + + protected $message = 'Unknown exception'; // exception message + protected $code = 0; // user defined exception code + protected $file; // source filename of exception + protected $line; // source line of exception + + function __construct(string $message=NULL, int code=0); + + final function getMessage(); // message of exception + final function getCode(); // code of exception + final function getFile(); // source filename + final function getTrace(); // an array of the backtrace() + final function getTraceAsString(); // formated string of trace + + /* Overrideable */ + function _toString(); // formated string for display + +} +?> +]]> + </programlisting> + </example> + <para> + If a class extends the built-in Exception class and re-defines the <link + linkend="language.oop5.decon">constructor</link>, it is highly recomended + that it also call <link + linkend="language.oop5.paamayim-nekudotayim">parent::__construct()</link> + to ensure all available data has been properly assigned. The <link + linkend="language.oop5.magic">__toString()</link> method can be overriden + to provide a custom output when the object is presented as a string. + </para> + <example> + <title>Extending the Exception class</title> + <programlisting role="php"> +<![CDATA[ +<?php + +class MyException extends Exception { + + /* Redefine the exception so message isn't optional */ + public function __construct($message, $code = 0) { + + // custom stuff you want to do.. + // ... + + /* make sure everything is assigned properly */ + parent::__construct($message, $code); + } + + /* custom string representation of object */ + public function __toString() { + return __CLASS__ . ": [{$this->code}]: {$this->message}\n"; + } + + public function customFunction() { + echo "A Custom function for this type of exception\n"; + } + +} + +class TestException { + + public $var; + + const THROW_NONE = 0; + const THROW_CUSTOM = 1; + const THROW_DEFAULT = 2; + + + function __construct($avalue = self::THROW_NONE) { + + switch ($avalue) { + case self::THROW_CUSTOM: + // throw custom exception + throw new MyException('1 is an invalid parameter', 5); + break; + + case self::THROW_DEFAULT: + // throw default one. + throw new Exception('2 isnt allowed as a parameter', 6); + + break; + + default: + // No exception, object will be created. + $this->var = $avalue; + break; + + } + + } + +} + +$o = null; + +try { + $o = new TestException(TestException::THROW_CUSTOM); +} +catch (MyException $e) { /* Will be caught */ + echo "Caught my exception\n", $e; + $e->customFunction(); +} +catch (Exception $e) { /* Skipped */ + echo "Caught Default Exception\n", $e; +} +var_dump($o); /* continue execution */ +echo "\n\n"; + +try { + $o = new TestException(TestException::THROW_DEFAULT); +} +catch (MyException $e) { /* Doesn't match this type */ + echo "Caught my exception\n", $e; + $e->customFunction(); +} +catch (Exception $e) { /* Will be caught */ + echo "Caught Default Exception\n", $e; +} +var_dump($o); /* continue execution */ +echo "\n\n"; + + +try { + $o = new TestException(TestException::THROW_CUSTOM); +} +catch (Exception $e) { /* Will be caught */ + echo "Default Exception caught\n", $e; +} +var_dump($o); /* continue execution */ +echo "\n\n"; + +try { + $o = new TestException(); +} +catch (Exception $e) { /* skipped, no exception */ + echo "Default Exception caught\n", $e; +} +var_dump($o); /* continue execution */ +echo "\n\n"; + + +]]> + </programlisting> + </example> + </sect2> </sect1>