异常的工作原理:
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().'
';//例外結果をスローするように書き直す
}
}
クラス mydb {
private $user;//ユーザー名
private $pass;//パスワード
private $host;//データベース IP アドレスまたはローカルホスト
private $db; //データベース名
//コンストラクター
パブリック関数 __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();
}
}
//データベース接続
プライベート関数 connect(){
//例外処理
試してみてください{
if (!$this->db =@
mysql_connect ($this->host,$this->user,$this->pass)){
$Exceptionstring = "接続に失敗しました: ホスト、ユーザー名、またはパスワードが間違っています";
throw new myException ($Exceptionstring,0);// カスタム例外オブジェクトをスローします。オブジェクトのインスタンス化時のパラメーターが間違っています
}
} catch (myException $e) {
エコー $e;
}
}
//データベースの選択
パブリック関数 selectdb ($thedb){
試してみてください{
if ([email=!@mysql_select_db]
!@mysql_select_db[/email] ($thedb, $this->db)){
$Exceptionstring = "データベース:
$thedb が存在しません";
throw new myException ($Exceptionstring,1);
}
} catch (myException $e) {
エコー $e;
}
}
//更新、削除を実行
パブリック関数の実行 ($thequery){
試してみてください{
if ([email=!@mysql_query]
!@mysql_query[/email] ($thequery, $this->db)){
$Exceptionstring = "間違った SQL
ステートメント:
$thequery ";
新しい myException ($Exceptionstring,2) をスローします;
} その他 {
echo "影響を受ける更新/削除: " . mysql_affected_rows () " ;
}
} catch (myException $e) {
エコー $e;
}
}
//ナレーション結果を返します
パブリック関数 getrows ($thequery){
試してみてください{
if (!$aquery =@ mysql_query ($thequery)){
$Exceptionstring = "間違ったクエリ ステートメント:
$thequery ";
新しい myException ($Exceptionstring,3) をスローします;
} その他 {
while ($adata = mysql_fetch_array ($aquery)){
$returnarr[] =$adata;
}
$returnarr を返します;
}
} catch (myException $e) {
エコー $e;
}
}
// デストラクターは接続を閉じます
パブリック関数 __destruct() {
試してみてください{
if ([email=!@mysql_close]
!@mysql_close[/email] ($this->db)){
$Exceptionstring = "接続を閉じることができませんでした";
新しい myException ($Exceptionstring,4) をスローします;
}
} catch (myException $e) {
エコー $e;
}
}
}
//インスタンスクラス
$mydb = 新しい mydb ("localhost","root","123456");
//データベースを選択
$mydb->selectdb ("tonlong");
//更新操作を実行します
$adata = $mydb->execute ("update db_news set hits=hits+1 where id=3");
//クエリ出力
$data = $mydb->getrows ("db_news からタイトルを選択");
for ($i = 0; $i
echo $data[$i][0] ."
";
}
?>
http://www.bkjia.com/PHPjc/629750.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/629750.html技術記事例外の仕組み: try { code handler; if (コード処理でエラーが発生した場合) throw new Exception ('例外をスローする') // Exception のオブジェクトを使用します //...