|
|
章 20. Exceptions
PHP 5 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.
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
set_exception_handler().
例子 20-1. Throwing an Exception
<?php
try {
$error = 'Always throw this error';
throw new Exception($error);
echo 'Never executed';
} catch (Exception $e) {
echo 'Caught exception: ', $e->getMessage(), "\n";
}
echo 'Hello World';
?>
|
|
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.
例子 20-2. The Built in Exception class
<?php
class Exception
{
protected $message = 'Unknown exception'; protected $code = 0; protected $file; protected $line; function __construct($message = null, $code = 0);
final function getMessage(); final function getCode(); final function getFile(); final function getLine(); final function getTrace(); final function getTraceAsString(); function __toString(); }
?>
|
|
If a class extends the built-in Exception class and re-defines the constructor, it is highly recomended
that it also call parent::__construct()
to ensure all available data has been properly assigned. The __toString() method can be overriden
to provide a custom output when the object is presented as a string.
例子 20-3. Extending the Exception class
<?php
class MyException extends Exception
{
public function __construct($message, $code = 0) {
parent::__construct($message, $code);
}
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 new MyException('1 is an invalid parameter', 5);
break;
case self::THROW_DEFAULT:
throw new Exception('2 isnt allowed as a parameter', 6);
break;
default:
$this->var = $avalue;
break;
}
}
}
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (MyException $e) { echo "Caught my exception\n", $e;
$e->customFunction();
} catch (Exception $e) { echo "Caught Default Exception\n", $e;
}
var_dump($o);
echo "\n\n";
try {
$o = new TestException(TestException::THROW_DEFAULT);
} catch (MyException $e) { echo "Caught my exception\n", $e;
$e->customFunction();
} catch (Exception $e) { echo "Caught Default Exception\n", $e;
}
var_dump($o);
echo "\n\n";
try {
$o = new TestException(TestException::THROW_CUSTOM);
} catch (Exception $e) { echo "Default Exception caught\n", $e;
}
var_dump($o);
echo "\n\n";
try {
$o = new TestException();
} catch (Exception $e) { echo "Default Exception caught\n", $e;
}
var_dump($o);
echo "\n\n";
?>
|
|
| |