异常的工作原理:
try
{
代码处理程序;
if(代码处理发生错误)throw new Exception('抛出一个异常');//使用throw关键字,后面是Exception的一个对象
//需要说明的是php5异常不会自动抛出异常
//抛出异常后下面处理程序不再执行
代码处理程序;
}
catch Exception $e
{
处理异常;
//如:echo 'Exception '.$e->getCode().':'.$e->getMessage().'in'.$e->getFile().'on line'.$e->getLine();
}
看看抛出的异常类系统是如何定义的
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();//与getTrace()一样,只不过它将格式化为字符串
function __toString();//需要对象的字符串表示时会自动调用这个方法,也就是一旦有echo或print直接输出Exception实例时就会被调用
}
Exception的属性不能在调用代码中直接访问,而必须使用获取方法获得其属性值,只用$message,$code能有用户抛出异常时设置,即给Exception类的构造函数完成。由Exception类可以看出我们完全可以继承Exception类创建我们自己的异常类,在检测错误时不再抛出系统默认的异常对象,而是我们自定义的异常类对象,但我们只能继承构造函数、toString()方法和Exception的属性。
class myException extends Exception
{
function __toString()
{
return '
Exception '.$this->getCode().':'.$this->getMessage().'in'.$this->getFile().'on line'.$this->getLine().'
';//改写抛出异常结果
}
}
在代码中调用我们自定义的异常类
try
{
throw new myException('错误',10);//为了简单,直接抛出自定义异常对象
}
catch(myException $e)
{
echo $e;//由于我们的自定义异常已经改变了输出方式,所以这里直接输入异常对象即可,原因为一旦有echo或print直接输出Exception实例时就会被调用__toString()
}
以上单间的介绍了异常,下面我们把异常引入我们的
数据库处理类中看看如何使用
class myException extends Exception{
function __construct($message=null,$code=0)
{
parent::__construct($message,$code);
}
function __toString()
{
return '
Exception '.$this->getCode().':'.$this->getMessage().'in File:'.$this->getFile().' on line:'.$this->getLine().'
';//Rewrite the exception result
}
}
class mydb {
private $user;//username
private $pass;//Password
private $host;//database ip address or localhost
private $db; //database name
//Constructor
public function __construct (){
$num_args = func_num_args();
if($num_args > 0){
$args = func_get_args();
$this->host = $args[0];
$this->user = $args[1];
$this->pass = $args[2];
//Automatically call the database connection after passing in parameters
$this->connect();
}
}
//Database connection
private function connect (){
//Exception handling
try {
if (!$this->db =@
mysql_connect ($this->host,$this->user,$this->pass)){
$exceptionstring = "Connection failed: Wrong host, username or password";
throw new myException ($exceptionstring,0);//Throw a custom exception object, the parameter is wrong when instantiating the object
}
} catch (myException $e) {
echo $e;
}
}
//Database selection
public function selectdb ($thedb){
try {
if ([email=!@mysql_select_db]
!@mysql_select_db[/email] ($thedb, $this->db)){
$exceptionstring = "Database:
$thedb does not exist";
throw new myException ($exceptionstring,1);
}
} catch (myException $e) {
echo $e;
}
}
//Execute an update, delete
public function execute ($thequery){
try {
if ([email=!@mysql_query]
!@mysql_query[/email] ($thequery, $this->db)){
$exceptionstring = "Wrong sql
statement:
$thequery ";
throw new myException ($exceptionstring,2);
} else {
echo "update/delete affected: " . mysql_affected_rows () . " row
";
}
} catch (myException $e) {
echo $e;
}
}
//Return the narration result
public function getrows ($thequery){
try {
if (!$aquery =@ mysql_query ($thequery)){
$exceptionstring = "Wrong query statement:
$thequery ";
throw new myException ($exceptionstring,3);
} else {
while ($adata = mysql_fetch_array ($aquery)){
$returnarr[] =$adata;
}
return $returnarr;
}
} catch (myException $e) {
echo $e;
}
}
//Destructor closes the connection
public function __destruct() {
try {
if ([email=!@mysql_close]
!@mysql_close[/email] ($this->db)){
$exceptionstring = "Failed to close connection";
throw new myException ($exceptionstring,4);
}
} catch (myException $e) {
echo $e;
}
}
}
//Instance class
$mydb = new mydb ("localhost","root","123456");
//Select database
$mydb->selectdb ("tonlong");
//Perform update operation
$adata = $mydb->execute ("update db_news set hits=hits+1 where id=3");
//Query output
$data = $mydb->getrows ("select title from db_news");
for ($i = 0; $i < count ($data); $i++){
echo $data[$i][0] ."
";
}
?>
http://www.bkjia.com/PHPjc/629750.htmlwww.bkjia.comtruehttp: //www.bkjia.com/PHPjc/629750.htmlTechArticleException working principle: try { code handler; if (code processing error occurs) throw new Exception('throw Throw an exception');//Use the throw keyword, followed by an object of Exception//...