程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php5程序異常處理

php5程序異常處理

編輯:關於PHP編程

異常的工作原理:
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 '<div class="error">Exception '.$this->getCode().':'.$this->getMessage().'in'.$this->getFile().'on line'.$this->getLine().'</div>';//改寫拋出異常結果
}
}

在代碼中調用我們自定義的異常類
try
{
throw new myException('錯誤',10);//為了簡單,直接拋出自定義異常對象
}
catch(myException $e)
{
echo $e;//由於我們的自定義異常已經改變了輸出方式,所以這裡直接輸入異常對象即可,原因為一旦有echo或print直接輸出Exception實例時就會被調用__toString()
}

以上單間的介紹了異常,下面我們把異常引入我們的數據庫處理類中看看如何使用
<?php
class myException extends Exception{
function __construct($message=null,$code=0)
{
parent::__construct($message,$code);
}
function __toString()
{
return '<div class="error">Exception '.$this->getCode().':'.$this->getMessage().'in File:'.$this->getFile().' on line:'.$this->getLine().'</div>';//改寫拋出異常結果
}
}
class mydb {
private $user;//用戶名
private $pass;//密碼
private $host;//數據庫ip地址或localhost
private $db; //數據庫名

//構造函數
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];
//傳入參數後自動調用數據庫連接
$this->connect();
}
}

//數據庫連接
private function connect (){
//異常處理
try {
if (!$this->db =@ mysql_connect ($this->host,$this->user,$this->pass)){
$exceptionstring = "連接失敗:主機、用戶名或密碼錯誤 ";
throw new myException ($exceptionstring,0);//拋出自定義異常對象,實例對象時參數錯誤
}
} catch (myException $e) {
echo $e;
}
}

//數據庫選擇
public function selectdb ($thedb){
try {
if ([email=!@mysql_select_db]!@mysql_select_db[/email] ($thedb, $this->db)){
$exceptionstring = "數據庫: <font color=red>$thedb</font>不存在 ";
throw new myException ($exceptionstring,1);
}
} catch (myException $e) {
echo $e;
}
}

//執行一個update,delete
public function execute ($thequery){
try {
if ([email=!@mysql_query]!@mysql_query[/email] ($thequery, $this->db)){
$exceptionstring = "錯誤的sql語句: <font color=red>$thequery</font> ";
throw new myException ($exceptionstring,2);
} else {
echo "update/delete受影響: " . mysql_affected_rows () . " 行<br />";
}
} catch (myException $e) {
echo $e;
}
}

//返回插敘結果
public function getrows ($thequery){
try {
if (!$aquery =@ mysql_query ($thequery)){
$exceptionstring = "錯誤的查詢語句: <font color=red>$thequery</font> ";
throw new myException ($exceptionstring,3);
} else {
while ($adata = mysql_fetch_array ($aquery)){
$returnarr[] =$adata;
}
return $returnarr;
}
} catch (myException $e) {
echo $e;
}
}

//析構函數關閉連接
public function __destruct() {
try {
if ([email=!@mysql_close]!@mysql_close[/email] ($this->db)){
$exceptionstring = "關閉連接失敗 ";
throw new myException ($exceptionstring,4);
}
} catch (myException $e) {
echo $e;
}
}

}
//實例類
$mydb = new mydb ("localhost","root","123456");
//選擇數據庫
$mydb->selectdb ("tonlong");
//執行更新操作
$adata = $mydb->execute ("update db_news set hits=hits+1 where id=3");
//查詢輸出
$data = $mydb->getrows ("select title from db_news");
for ($i = 0; $i < count ($data); $i++){
echo $data[$i][0] ."<br />";
}
?>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved