亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > PHP > 正文

細(xì)看PEAR的錯(cuò)誤處理

2019-09-08 23:11:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
PEAR提供了強(qiáng)大的錯(cuò)誤處理機(jī)制。這篇文章向你展示如何從這個(gè)系統(tǒng)中獲益。


許多程序已經(jīng)使用了PEAR的包。許多PHP程序員或多或少的熟悉了PEAR中的錯(cuò)誤處理。但是這個(gè)機(jī)制并不局限于PEAR的包――所有人都能在他們的類和程序中使用這些方法。

這篇文章被分為兩個(gè)部分:首先我們將看看類中用于錯(cuò)誤處理的函數(shù),然后我們將看看如何基于PEAR錯(cuò)誤處理機(jī)制來(lái)處理錯(cuò)誤。

我們的例子類稱為cvs2db,它把數(shù)據(jù)從CSV文件插入到數(shù)據(jù)庫(kù)的表中。因?yàn)閿?shù)據(jù)可能是手寫的,他們的數(shù)據(jù)應(yīng)該在插入之前先得到驗(yàn)證――落實(shí)postcode。函數(shù)import()完成讀入,檢查和插入的工作;它返回?fù)p壞的記錄數(shù)目。如果返回的值大于0,出錯(cuò)的記錄集能夠使用exportUnvalid()寫入到新的CSV文件中。典型的用法是這樣的:

<?php
$cd = new csv2db();
$dsn = 'mysql://root@localhost/csv2db';
if( 0 < $cd->import("./dat.csv", $dsn, 'address')) {
$cd->exportUnvalid("./dat2.csv");
}
?>



可能的錯(cuò)誤包括:

要導(dǎo)入的CSV文件不存在,
連接到數(shù)據(jù)庫(kù)失敗,
記錄集損壞,以及CSV導(dǎo)出文件無(wú)法創(chuàng)建。

在提供錯(cuò)誤信息的經(jīng)典解決方案中你可能寫這樣的代碼:

<?php
$cd = new csv2db();
$dsn = 'mysql://root@localhost/csv2db';
$result = $cd->import("./dat.csv", $dsn, 'address')
switch($result) {
case FILE_NOT_OPENED:
...
break;
case DATABASE_ERROR:
...
break;
default:
if(0 < $result) {
$cd->exportUnvalid("./dat2.csv");
} else {
echo 'every thing ok!'
}
}
?>



這對(duì)于短的腳本來(lái)說(shuō)是可接受的也是常用的辦法――但是對(duì)于錯(cuò)誤處理經(jīng)常受到關(guān)注的大程序來(lái)說(shuō)不是這樣。傳統(tǒng)的可能性強(qiáng)迫類的作者做最終的決定!在大部分情況下,這個(gè)決定根據(jù)的是那時(shí)對(duì)類的調(diào)用而不是基于長(zhǎng)期的使用和可重用代碼的思想。一個(gè)靈活的錯(cuò)誤處理機(jī)制是可重用代碼的重要部分,PEAR Error API 就是這樣的一種受到良好測(cè)試的機(jī)制。


用戶眼中的類

除了那兩個(gè)函數(shù)之外,類提供了一套錯(cuò)誤處理函數(shù)和一個(gè)自己的錯(cuò)誤對(duì)象稱為DB2CVS_Error,它有一個(gè)特殊的本地化的錯(cuò)誤信息的特性功能。

現(xiàn)在我將向你展示如何在錯(cuò)誤發(fā)生時(shí)控制類的行為。

局部和全局錯(cuò)誤處理

你用setErrorHandling()管理錯(cuò)誤處理;這個(gè)函數(shù)需要兩個(gè)參數(shù):第一個(gè)是錯(cuò)誤模式,而第二個(gè)(可選的)參數(shù)是錯(cuò)誤模式特定的選項(xiàng)。例如 setErrorHandling(PEAR_ERROR_PRINT, 'This error occurred %s') 還有 setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_WARNING)。


這個(gè)函數(shù)的調(diào)用方式是一般行為中最重要的:靜態(tài)還是實(shí)體。在類cvs2db中,我們能兩者都用來(lái)設(shè)置錯(cuò)誤處理,所有這些調(diào)用有相同的結(jié)構(gòu)――為類設(shè)置錯(cuò)誤模式:

// per instance
$cd = new csv2db();
$cd->setErrorHandling(PEAR_ERROR_DIE):
// static
CVS2DB::setErrorHandling(PEAR_ERROR_DIE);
PEAR::setErrorHandling(PEAR_ERROR_DIE);



如果兩者給出同樣的結(jié)果,區(qū)別在哪?實(shí)體調(diào)用僅僅為那個(gè)類設(shè)置而靜態(tài)調(diào)用對(duì)于所有使用PEAR_Error或者從那個(gè)類派生的所有類起作用。這個(gè)也作用于第一個(gè)靜態(tài)命令CVS2DB::setErrorHandling(PEAR_ERROR_DIE)――雖然它看上去僅僅影響了cvs2db類。


總結(jié):作為一個(gè)實(shí)體函數(shù)使用命令意味著僅僅為這個(gè)實(shí)體(局部)設(shè)置錯(cuò)誤模式,而作為靜態(tài)函數(shù)來(lái)調(diào)用就是為整個(gè)腳本設(shè)置錯(cuò)誤模式(全局)。


setErrorHandling() 和 raiseError()


兩個(gè)函數(shù)都能夠被靜態(tài)調(diào)用和作為實(shí)體的函數(shù)調(diào)用。記住怎樣的一個(gè)組合使得他們?nèi)绾位ハ嘤绊懙暮苤匾?br/>
基本上是:setErrorHandling()的靜態(tài)調(diào)用僅僅影響raiseError()的靜態(tài)調(diào)用――setErrorHandling()作為實(shí)體函數(shù)僅僅影響raiseError()作為靜態(tài)函數(shù)調(diào)用。在類csv2db中,使用csv2db::setErrorHandling()來(lái)設(shè)置錯(cuò)誤模式是不可行的,因?yàn)槲覀兪褂?this->raiseError(...)。解決這個(gè)聞天有一點(diǎn)小技巧――改寫raiseError():

function raiseError(...,$mode=null, $options=null,...) {
if($mode==null && $this->_default_error_mode!=null) {
$mode = $this->_default_error_mode;
$options = $this->_default_error_options;
}
return PEAR::raiseError(...,$mode, $options,...);
}



這樣,我們映射實(shí)體調(diào)用到靜態(tài)上,如果你用錯(cuò)誤模式調(diào)用raiseError(),然后這個(gè)模式將會(huì)覆蓋這些設(shè)置――這里是指的是全局的設(shè)置。

你應(yīng)當(dāng)當(dāng)心錯(cuò)誤是如何被類拋出的,如果你不小心,這可能導(dǎo)致不可預(yù)期的副作用。


錯(cuò)誤的模式

對(duì)錯(cuò)誤模式的了解對(duì)于使用PEAR的錯(cuò)誤處理來(lái)說(shuō)是重要的。PEAR錯(cuò)誤處理讓用戶能夠決定怎么去做――注意:下文中術(shù)語(yǔ)用戶指的的是實(shí)際使用PEAR_Error程序的開發(fā)者而不是瀏覽腳本結(jié)果或者網(wǎng)頁(yè)的用戶。我將詳細(xì)展示可能的錯(cuò)誤模式。

PEAR_ERROR_DIE――將這個(gè)模式開啟,程序?qū)⒔K結(jié)并且將打印錯(cuò)誤信息??蛇x的,你能定義一個(gè)printf()式的字符串,它能夠用于產(chǎn)生信息;首先'%s'在字符串中將替代儲(chǔ)存在錯(cuò)誤對(duì)象中的錯(cuò)誤信息。

PEAR_ERROR_PRINT――僅僅打印錯(cuò)誤信息,包括用于PEAR_ERROR_DIE的同樣的可選用的字符串。

PEAR_ERROR_RETURN――當(dāng)錯(cuò)誤發(fā)生時(shí)的一般行為;你能用類提供isError()函數(shù)或者PEAR::isError()檢查錯(cuò)誤。

$db->setErrorhandling(PEAR_ERROR_RETURN)
if(!csv2db::isError(0 < $d = $cd->import("./dat.csv", $dsn, 'address'))) {
if(!csv2db::isError($cd->exportUnvalid("./dat2.csv")) {
} else {
// handle error
}
} else {
// handle error
}



PEAR_ERROR_TRIGGER――這兒函數(shù)向PHP運(yùn)行時(shí)錯(cuò)誤行為一樣。你必須定義哪種錯(cuò)誤應(yīng)該發(fā)生:E_USER_NOTICE,E_USER_WARNING或者E_USER_ERROR。他們直接和PHP本身產(chǎn)生的信息相對(duì)應(yīng)。請(qǐng)注意,在錯(cuò)誤信息中錯(cuò)誤發(fā)生的那行(xxx on line yy)指的是在PEAR.php中調(diào)用trigger_error的那行――而不是錯(cuò)誤直接發(fā)生的那行。

PEAR_ERROR_CALLBACK――這是只在一個(gè)地方處理錯(cuò)誤并且讓你得代碼不用考慮錯(cuò)誤處理的最佳方式。它需要一個(gè)函數(shù)或者類函數(shù)來(lái)捕獲錯(cuò)誤,你能寫一個(gè)listing 2中展示的那樣的腳本,其中可以看到類相關(guān)錯(cuò)誤對(duì)象的好處:import()函數(shù)拋出一個(gè)CSV2DB_Error給基于CSV的錯(cuò)誤和一個(gè)DB_Error對(duì)象給相關(guān)于數(shù)據(jù)庫(kù)訪問(wèn)的錯(cuò)誤。

Listing 2

$cd = new csv2db();
$cd->setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');
$dsn = 'mysql://root@localhost/csv2db';
if( 0 < $d = $cd->import("./dat.csv", $dsn, 'address')) {
$cd->exportUnvalid("./dat2.csv");
}

function handleError($error) {
if(DB::isError($error) {
// handle database error
}
if(csv2db::isError($error) {
switch($error->getCode()) {
case FILE_NOT_OPENED :
...
break;
case CORRUPTED_RECORD :
...
break;
}
}
}



單個(gè)的錯(cuò)誤處理

我們有兩種可能的錯(cuò)誤:我們能夠忽略的錯(cuò)誤(損壞的記錄),以及使得程序無(wú)法運(yùn)行的錯(cuò)誤(找不到文件或者打不開數(shù)據(jù)庫(kù))。如果你在shell腳本中使用類,你可以讓腳本終止于第二類錯(cuò)誤。

自然的,你可以寫 $cd->setErrorHandling(PEAR_ERROR_DIE)――但是這可能在如果損壞的記錄錯(cuò)誤發(fā)生時(shí)導(dǎo)致問(wèn)題。在這樣的情況下你需要對(duì)某個(gè)錯(cuò)誤停用或者替換錯(cuò)誤處理辦法的可能。解決辦法時(shí)expectError(),如果你傳遞一個(gè)錯(cuò)誤代碼給這個(gè)函數(shù),指定錯(cuò)誤的錯(cuò)誤模式將被單獨(dú)于缺省錯(cuò)誤模式地設(shè)置為PEAR_ERROR_RETURN。

expectError()函數(shù)把傳遞來(lái)的錯(cuò)誤代碼儲(chǔ)存在棧中,使用popExpected()移出最后傳遞的錯(cuò)誤代碼。自從PHP 4.3之后你還能使用delExpect()了;這個(gè)函數(shù)從棧中刪除了指定錯(cuò)誤代碼的匹配,你不需要關(guān)心位置了。

在實(shí)際使用中,是這樣的:

$cd->setErrorHandling(PEAR_ERROR_DIE);
...
$cd->expectError(CORRUPTED_RECORD);
$cd->import(...);
$cd->popExpect();



pushErrorHandling() 和 popErrorHandling() 用起來(lái)差不多;他們能夠暫時(shí)的控制錯(cuò)誤處理。例如:如果在 exportUnvalid() 中的文件不能打開,你想要忽略錯(cuò)誤:

PEAR::pushErrorHandling(PEAR_ERROR_RETURN);
$cd->exportUnvalid("./dat2.csv");
PEAR::popErrorHandling();



注意調(diào)用方法的區(qū)別!expectError()/popExpect()必須作為實(shí)體函數(shù)來(lái)調(diào)用――pushErrorHandling和popErrorHandling可以靜態(tài)調(diào)用。如果作為實(shí)體函數(shù),那么他們僅僅影響那個(gè)實(shí)體。

用戶有很多可能性,這是否又意味著程序員要做很多的工作呢?是,是因?yàn)槟阋萺eturn false做更多的事情;否,是因?yàn)镻EAR Error API給你完成了很多工作。


一些關(guān)于錯(cuò)誤處理的思考

作為好的程序員,你不應(yīng)該從你的類的用戶眼中遮掩起確切的錯(cuò)誤原因。這阻止了簡(jiǎn)單的return false的用法;還要注意也可能被PHP自動(dòng)型別轉(zhuǎn)換為0――這對(duì)于import()函數(shù)來(lái)說(shuō)意味著所有的記錄都已經(jīng)被正確插入了!簡(jiǎn)單地終止腳本?,可能對(duì)于簡(jiǎn)單地PHP shell腳本來(lái)說(shuō)這是可以接受地,但是對(duì)于一個(gè)web程序來(lái)說(shuō)是一個(gè)壞的選擇!而且,在記錄損壞的情況,錯(cuò)誤是能夠被忽略的。什么不trigger_error()?這是一個(gè)可能的選擇,但是有兩個(gè)缺點(diǎn):類的行為取決于php.ini的設(shè)置,而且對(duì)于類來(lái)說(shuō)這種行為不常見(jiàn)??赡苄阅軌蛐枰妙~外的函數(shù)找出錯(cuò)誤狀態(tài)。即使是所有類都提供了非標(biāo)準(zhǔn)的函數(shù)名,這還是有問(wèn)題的,而且類的用戶看上去會(huì)忘記那樣的函數(shù)調(diào)用――正如郵件列表和新聞組中顯示的那樣。怎么辦?讓用戶決定PEAR錯(cuò)誤處理API。PEAR錯(cuò)誤系統(tǒng)被廣泛知道并且許多類已經(jīng)使用了PEAR類;因而我們無(wú)論如何必須用PEAR錯(cuò)誤處理機(jī)制――為什么不建立在其上呢?這避免了前面提到的問(wèn)題并且給用戶提供了很大的可能性??纯碙isting 1,它展示了csv2db類和它的錯(cuò)誤對(duì)象的實(shí)現(xiàn)。它可能是有些讓人嚇到,但是我們將一行行地瀏覽源代碼。

Listing 1

<?php
require_once 'PEAR.php';
require_once 'DB.php';

define("FILE_NOT_OPENED", 10);
define("CORRUPTED_RECORD", 20);

class csv2db extends PEAR{

var $records=array();
var $unvalid=array();

function csv2db() {
$this->PEAR("CSV2DB_Error");
}

function import($file, $dsn, $table) {
$this->PEAR("CSV2DB_Error");
if($fp=@fopen($file, 'r')) {
while($data=fgetcsv($fp, 1024,';')) {
$this->records[]=$data;
}
fclose($fp);
} else {
return $this->raiseError(null, FILE_NOT_OPENED);
}

$unvalidCount=0;

$storeMode = $GLOBALS['_PEAR_default_error_mode'];
$storeOpts = $GLOBALS['_PEAR_default_error_options'];
$GLOBALS['_PEAR_default_error_mode'] = $this->_default_error_mode;
$GLOBALS['_PEAR_default_error_options'] = $this->_default_error_options;

$db = DB::connect($dsn);

$GLOBALS['_PEAR_default_error_mode']= $storeMode;
$GLOBALS['_PEAR_default_error_options'] = $storeOpts;

if(!DB::isError($db)) {
$db->setErrorHandling($this->_default_error_mode,
$this->_default_error_options);
$qp = $db->prepare("INSERT INTO $table VALUES (?, ?, ?, ?)");
foreach( $this->records as $record) {
if(preg_match('/d{5}/',$record[2])) {
$db->execute($qp, $record);
} else {
$unvalidCount++;
$this->unvalid[]=$record;
$this->raiseError(corrupted record, CORRUPTED_RECORD);
}
}
$db->disconnect();
} else {
return $db;
}
return $unvalidCount;
}

function exportUnvalid($file) {
if($fp=@fopen($file, "w")) {
foreach($this->unvalid as $data) {
fwrite($fp, implode(';', $data)."n", 1024);
}
fclose($fp);
} else {
return $this->raiseError(null,FILE_NOT_OPENED);
}
}

function isError($data) {
return (bool)(is_object($data) &&
(get_class($data) == 'CSV2DB_Error' ||
is_subclass_of($data, 'CSV2DB_Error')));
}
}

class CSV2DB_Error extends PEAR_Error {
var $msgs = array(
FILE_NOT_OPENED =>
array( 'de' =>"Datei konnte nicht ge?ffnet werden",
'en' => "File couldn't be opened"),
CORRUPTED_RECORD =>
array( 'de' =>"fehlerhafter Datensatz",
'en' => "corrupted record")
);

function CSV2DB_Error($message=null, $code = null, $mode = null,
$level = null, $debuginfo = null) {
$this->PEAR_Error(null, $code, $mode, $level, $debuginfo);
}

function getMessage($lang = "en") {
return $this->msgs[$this->code][$lang];
}
}
?>



自己的錯(cuò)誤對(duì)象

有一個(gè)自己的錯(cuò)誤類總是好的,雖然它可能對(duì)于這么一個(gè)小的類來(lái)說(shuō)是太大的額外負(fù)擔(dān)――但是這個(gè)類僅僅是一個(gè)例子并且你從如果沒(méi)有錯(cuò)誤對(duì)象需要很多代碼來(lái)實(shí)現(xiàn)的特性那兒獲益良多。好處是:首先錯(cuò)誤是直接賦給類的;以及本地化變得更加容易。

類必須從PEAR_Error繼承而來(lái),為的是保持我們的實(shí)現(xiàn)簡(jiǎn)單,否則PEAR::isError()將不能正常工作。

實(shí)現(xiàn)包含了構(gòu)造函數(shù),其中沒(méi)有改變地把參數(shù)傳遞給了PEAR_Error地構(gòu)造函數(shù)。

改寫getMessage()函數(shù)是提供本地化錯(cuò)誤信息地關(guān)鍵。錯(cuò)誤定西被定義為類的變量并且將取決于語(yǔ)言動(dòng)態(tài)的賦值。這也將幫助消息聚集于一處――而不是把他們分散于整個(gè)主要類的源代碼中。

實(shí)現(xiàn)PEAR錯(cuò)誤處理

你在文章的第一部分看到了我們的類提供了一堆函數(shù)――但是他們中的僅僅有四個(gè)是直接實(shí)現(xiàn)的。所有的相關(guān)函數(shù)的錯(cuò)誤處理是由PEAR基類提供的。為了從所有那些錯(cuò)誤處理特性中獲益,我們必須讓cvs2db類從PEAR基類繼承,也就是:class csv2db extends PEAR。

在前面的錯(cuò)誤對(duì)象段落中,我從對(duì)isError()的解釋開始。覆蓋這個(gè)方法不是必要的,雖然它確實(shí)使得我們能夠直接檢查我們的錯(cuò)誤類,并且使得錯(cuò)誤跟蹤更加精確并且可能節(jié)約了幾毫秒。

類的構(gòu)造函數(shù)僅僅只是用錯(cuò)誤類名稱最為參數(shù)調(diào)用了父類的構(gòu)造函數(shù)。這個(gè)調(diào)用注冊(cè)了我們的錯(cuò)誤對(duì)象并且確保了我們的錯(cuò)誤類在每次觸發(fā)錯(cuò)誤的時(shí)候被使用。


raiseError

在import()和exportUnvalid()的函數(shù)體中對(duì)raiseError()的使用是值得注意的。這是創(chuàng)建錯(cuò)誤的關(guān)鍵函數(shù);PEAR提供兩個(gè)函數(shù)用于這個(gè)目的:raiseError() 和 throwError()。后一個(gè)自從PHP 4.3開始存活在并且是raiseError()的一個(gè)簡(jiǎn)化變體,兩者行為是一致的;它們的參數(shù)在段落 'raiseError 和 throwError' 中描述。


raiseError 和 throwError

原型:

&raiseError( $message, $code, $mode, $options, $userinfo, $errorclass, $skipmessage)
&throwError( $message, $code, $userinfo)

Parameter Description
$message (string) The error message
$code (int) The error number
$mode (constant) Error mode
$options (mixed) Error mode specific parameters
$userinfo (mixed) additional data (ie. Debug information)
$errorclass (string) A class name



可選的你能夠把已經(jīng)存在的錯(cuò)誤對(duì)象傳遞給這些函數(shù):

&raiseError($error_object)
&throwError($error_object)



如果你從源代碼比較這兩個(gè)函數(shù)的參數(shù)表你將看到類并沒(méi)有設(shè)置message參數(shù)――這是不必須的因?yàn)槲覀冊(cè)阱e(cuò)誤類中用 getMessage() 函數(shù)賦給錯(cuò)誤信息。而且,調(diào)用PEAR構(gòu)造函數(shù)來(lái)引入你的錯(cuò)誤類也是不必要的,你可以在對(duì) raiseError() 調(diào)用中指定錯(cuò)誤類。在腦子中記住這個(gè)選項(xiàng)!例如,如果你的類提供了靜態(tài)函數(shù)或者多于一個(gè)錯(cuò)誤對(duì)象,你不能給你的類像我們?cè)赾sv2db中做得那樣全局地設(shè)置它們。

raiseError() 和 throwError() 能夠被靜態(tài)地調(diào)用以及像 setErrorHandling() 那樣作為實(shí)體函數(shù)來(lái)調(diào)用。當(dāng)你作不作靜態(tài)調(diào)用地時(shí)候做正確地決定是重要的――它直接影響了用戶如何用setErrorHandling()來(lái)錯(cuò)作我們的類。留意 setErrorHandling() 和 raiseError(),這將避免你和你的用戶的頭疼。

從類的這個(gè)部分能夠看到全局和局部的錯(cuò)誤設(shè)置和觸發(fā)的負(fù)面影響。

$storeMode = $GLOBALS['_PEAR_default_error_mode'];
$storeOpts = $GLOBALS['_PEAR_default_error_options'];
$GLOBALS['_PEAR_default_error_mode'] = $this->_default_error_mode;
$GLOBALS['_PEAR_default_error_options'] = $this->_default_error_options;

$db = DB::connect($dsn);

$GLOBALS['_PEAR_default_error_mode'] = $storeMode;
$GLOBALS['_PEAR_default_error_options'] = $storeOpts;



首先,全局的錯(cuò)誤模式被保存了,然后全局的錯(cuò)誤模式設(shè)置給了局部的錯(cuò)誤模式并且最后幾行,原來(lái)的錯(cuò)誤模式被還原了。為什么?Connect()是一個(gè)靜態(tài)函數(shù)!它必須使用PEAR::raiseError()。因而假如我們不保存并且還原設(shè)置,我們會(huì)遇到問(wèn)題:看看listing 3――如果類在import()函數(shù)不能連接到數(shù)據(jù)庫(kù)的時(shí)候會(huì)發(fā)生什么?因?yàn)閷?duì)raiseError()的靜態(tài)調(diào)用受到全局錯(cuò)誤模式的影響,而不是局部的$cd->setErrorHandling(...)的影響,腳本終止執(zhí)行 。實(shí)際上push和popErrorHandling()就是設(shè)計(jì)來(lái)用于這樣的任務(wù)的――但是PHP中一個(gè)現(xiàn)下的bug看上去不幸的組織了它很好的工作。

強(qiáng)制$db對(duì)象使用我們的錯(cuò)誤模式是更舒服的方式,它支持完整的PEAR Error API,這使得代碼能這樣寫:$db->setErrorHandling($this->_default_error_mode, $this->_default_error_options)。兩個(gè)實(shí)體變量都是由PEAR_Error類提供的。

那行$this->raiseError(corrupted record, CORRUPTED_RECORD)看上去值得注意――而且缺失的返回看上去不順眼。原因是:我們不想在發(fā)現(xiàn)損壞的記錄時(shí)中止函數(shù)執(zhí)行。你能把這個(gè)和觸發(fā)一個(gè)警告進(jìn)行比照。唯一的限制時(shí)模式PEAR_ERROR_RETURN沒(méi)有工作。

Listing 3

<?php
...
PEAR::setErrorHandling(PEAR_ERROR_DIE)

$cd = new csv2db();
$cd->setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError');
$dsn = 'mysql://root@localhost/csv2db';
if( 0 < $d = $cd->import("./dat.csv", $dsn, 'address')) {
$cd->exportUnvalid("./dat2.csv");
}

$db = DB::connect($dsn);
$db->query(...);
...

function handleError($error) {
if(DB::isError($error) {
// handle database error
}
if(csv2db::isError($error) {
switch($error->getCode()) {
case FILE_NOT_OPENED :
...
break;
case CORRUPTED_RECORD :
...
break;
}
}
}
?>




PEAR錯(cuò)誤處理和PHP 5

因?yàn)槲覀兪褂煤瘮?shù)來(lái)創(chuàng)建錯(cuò)誤,我們沒(méi)有考慮在PHP 5中的try/catch/throw機(jī)制;raiseMethod和throwError將為你完成這些!對(duì)于PHP 5,函數(shù)能夠?yàn)槟愕念愅该鞯卣{(diào)用拋出PEAR_Error()――錯(cuò)誤模式PEAR_ERROR_EXCEPTION能夠用于這個(gè)目的。一下的代碼應(yīng)該能夠在不改變類的情況下用于PHP5中:

<?php
$i = new csv2db();
$dsn = 'mysql://root@localhost/csv2db';
try {
if( 0 < $d = $i->import("./dat.csv", $dsn, 'address')) {
$i->exportUnvalid("./dat2.csv");
}
}
catch CSV2DB_Error {
// fetch the error
}
?>



結(jié)論

我希望你大概了解了PEAR錯(cuò)誤處理,它提供了排除和處理錯(cuò)誤的強(qiáng)大機(jī)制??纯碢EAR手冊(cè)[1]的代碼部分并且找出這些函數(shù)提供的好處。

Alexander Merz (alexmerz at php dot net) 是PEAR手冊(cè)的編輯并且以自由創(chuàng)作者和作家為職業(yè)。

鏈接

[1] pear.php.net/manual/en/core.pear.html
上一篇:PHP4之真OO

下一篇:超越模板引擎

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
精品大片一区二区| 九色porny视频在线观看| 国产精品亚洲自拍| 一区二区中文字幕在线| 97在线视频观看| 国产日韩欧美精品一区| 日本乱理伦在线| 欧美一区二区三区四区在线观看地址| 成人精品亚洲人成在线| 里番全彩acg☆无翼乌全彩3d| 欧美大片在线观看一区| 国产精品嫩草影院8vv8| 精精国产xxxx视频在线| 国产精品999视频| 亚洲一区二区三区四区五区午夜| 在线免费观看av网址| 亚洲午夜激情网站| 久热re这里精品视频在线6| 91精品国产91久久久久久三级| 亚洲精品伦理在线| 欧美日韩国产麻豆| 亚洲女人毛茸茸高潮| 日日噜噜噜夜夜爽爽| 日韩污视频在线观看| 欧美高清69hd| 久久精品国产免费| 熟女视频一区二区三区| 国产情侣久久久久aⅴ免费| 女人黄色一级片| 亚洲自拍偷拍精品| 国产精品原创| 欧美午夜寂寞影院| 亚洲激情在线激情| 中出视频在线观看| 免费vip影院| 91传媒在线观看| 中文字幕在线观看国产| 亚洲国产高清在线观看视频| 精品国产一区二区三区麻豆免费观看完整版| 欧美日韩精品系列| 亚洲国产精品va在线观看黑人| 奇米色777欧美一区二区| 国产精品迅雷| 欧美人体大胆444www| 夜夜摸视频网| 波多结衣在线观看| 国产精品露脸视频| 久久久久久久久久97| 日本一区二区三区四区高清视频| 日韩欧美在线影院| 亚洲色在线视频| 簧片在线免费看| 日韩精品在线一区| 精品免费囯产一区二区三区| 久久精品女人天堂| 麻豆精品国产自产在线| 任我爽精品视频在线播放| 久操成人av| 午夜精品亚洲一区二区三区嫩草| 久久久久黄久久免费漫画| 色综合久久九月婷婷色综合| 香港三日本8a三级少妇三级99| 国产精品成人一区二区三区吃奶| 久草在线资源视频在线观看| 加勒比久久高清| 自拍偷拍欧美一区| 国产99久久精品一区二区 夜夜躁日日躁| 久久中国妇女中文字幕| 国产精品成人99一区无码| 精品久久影视| 免费看黄色的网站| 在线观看视频网站你懂得| 色婷婷综合中文久久一本| 日韩精品在线播放视频| 亚洲第一第二区| 欧美欧美天天天天操| 99久久综合狠狠综合久久止| 色悠悠久久88| 一区二区三区免费视频网站| 偷拍亚洲精品| 国产熟女一区二区丰满| 国产夫妻性生活视频| 91社区在线高清| 欧美亚视频在线中文字幕免费| 久久久久久一级片| kk眼镜猥琐国模调教系列一区二区| 国产嫩草在线视频| 欧美在线亚洲在线| 国产欧美亚洲精品| 亚洲精品久久区二区三区蜜桃臀| 久久―日本道色综合久久| 熟女丰满老熟女熟妇| 男女视频在线| 亚洲视频国产视频| 日韩美女在线观看| 91成人理论电影| 日韩福利视频网| 欧美videos巨大粗暴| 久久精品视频在线观看免费| 97精品久久久| 小说区视频区图片区| 久久综合九色综合88i| 在线亚洲国产精品网| 91高清在线观看视频| 色偷偷91综合久久噜噜| 亚洲无码精品在线观看| 国产免费永久在线观看| 亚洲国产精品va在看黑人| 老司机精品视频在线| 亚洲尤物视频在线| 精品国产一区一区二区三亚瑟| 天堂资源在线亚洲| www.66久久| 中文字幕乱码一区二区| 国产视频1区| 一区二区三区不卡视频在线观看| 欧美在线免费视屏| 国产精品日韩三级| 奇米影视狠888| 精品国产av鲁一鲁一区| 国产免费电影网站入口| 国产suv精品一区二区| 久久久久久久极品内射| 国产精品久久久久久久久图文区| 午夜电影一区二区三区| 无码人妻av一区二区三区波多野| 欧美日韩国产精品激情在线播放| 伊人在线视频| 波霸ol色综合网| 国产在线激情视频| 国内伊人久久久久久网站视频| 最新天堂网www| 色天天综合网| 国产在线精品一区二区三区不卡| 爽爽爽爽爽爽爽成人免费观看| 台湾成人av| 久久久久成人网站| 一区二区视频免费在线观看| 日本激情综合网| 丝袜美腿一区二区三区动态图| 亚洲高清在线观看一区| 亚洲成人教育av| 免费成人深夜夜行视频| 人妖欧美一区二区| 国产视频一区二区在线播放| 精品国产乱码久久久久久浪潮| 成人羞羞视频免费看看| 在线观看免费高清视频97| 岛国精品资源网站| 欧美又粗又大又爽| 国产福利一区二区三区| 亚洲色图第一页| 日日摸夜夜添夜夜添国产精品| 久久99日本精品| 欧美xoxoxo| 免费看的国产视频网站| 亚洲精品电影在线一区| 亚洲国产裸拍裸体视频在线观看乱了中文| 亚洲午夜影视影院在线观看| 伊人波多野结衣| 国产欧美日韩另类一区| 中文乱码字幕av网站| 日本午夜精品理论片a级app发布| 亚洲国产一区二区在线播放| 原创真实夫妻啪啪av| 国产在线观看免费麻豆| 激情五月六月婷婷| 91精品人妻一区二区三区四区| 欧美日韩国产免费观看| 1024在线播放| 国产经典一区二区三区| 欧美一级片久久久久久久| 依依成人在线| 久久噜噜噜精品国产亚洲综合| 香蕉视频成人在线观看| 欧美日韩免费高清一区色橹橹| 久久精品国产在热久久| 国产黑丝在线一区二区三区| 黄色一级片免费在线观看| 国产乱淫av一区二区三区| 久久久精品日韩欧美| 亚洲精品一二三**| 欧洲日本不卡| 婷婷五月综合久久中文字幕| 一女二男一黄一片| 亚洲jjzzjjzz在线观看| 国产精品无圣光一区二区| 日本妇女毛茸茸| 性一交一乱一伧国产女士spa| av成人综合| 美丽的小蜜桃4春潮| 麻豆传媒在线免费看| 另类国产ts人妖高潮视频| 亚洲天堂手机| 久久久精品一区二区涩爱| 精品日韩在线播放| 香蕉久久久久久久av网站| 日韩国产欧美三级| 久久狠狠高潮亚洲精品| 伊人性伊人情综合网| 99国内精品| 日韩一级片免费视频| 欧美日本国产视频| 日韩在线免费播放| 日韩欧美精品网站| 91在线九色porny| 成人情趣片在线观看免费| lutube成人福利在线观看| 俄罗斯黄色录像| 91久色porny| 国产精品美女久久久久av福利| 国产中文字幕av| 人妻中文字幕一区| 在线免费看黄网站| 丝袜美腿亚洲一区二区图片| 天堂在线视频观看| 亚洲欧美专区| 欧美高清免费| 久久精品国产一区二区电影| 色综合一区二区| 亚洲伦理精品| 韩国成人av| 国产精品麻豆入口| sis001亚洲原创区| 136导航精品福利| 成人中文在线| 日韩欧美中文字幕视频| 久草免费在线视频观看| 山东少妇露脸刺激对白在线| 四虎成人欧美精品在永久在线| 亚洲视频资源在线| 国产av无码专区亚洲av麻豆| 亚洲国产精品一区二区久久| 国产精品毛片久久久久久| 99精品视频国产| 91一区二区三区四区| 日韩av一区在线| 欧美女人性生活视频| 你懂的在线视频观看| 国产精品综合一区二区三区| 娇妻高潮浓精白浆xxⅹ| 黄色网址免费看| 国产视频精品免费播放| 媚黑女一区二区| 中文字幕视频网站| 一级特黄aaa大片在线观看| 亚洲av无码一区二区三区网址| 国产一区二区三区四区五区3d| 欧美午夜影院| 美女日批在线观看| 日韩av无码一区二区三区不卡| 色偷偷www8888| 久草网站在线| 男人的天堂免费| 成人av在线影院| 91 com成人网| 99久久er热在这里只有精品15| 精品人妻少妇一区二区| 成人一区二区三区视频| 亚洲国产日韩欧美一区二区三区| 在线免费观看视频网站| 特级丰满少妇一级aaaa爱毛片| 欧美性生活久久| 日本年轻的继坶中文字幕| 亚洲动漫在线观看| 欧美一级精品片在线看| 成人一级免费视频| 日本最新中文字幕| 成人资源视频网站免费| 91精品久久久久久久久久不卡| 天天久久综合| 亚洲欧洲在线看| 国产夫妻在线播放| 欧美床上激情在线观看| 亚洲高清999| 日韩欧美国产成人精品免费| 91大神在线观看线路一区| 日本一二三区不卡| 男女男精品视频| 国产精品yjizz| 米奇777在线欧美播放| 成人午夜精品| 亚洲天堂自拍偷拍| 蜜桃av噜噜一区二区三区小说| 精品亚洲永久免费精品| 国产a∨精品一区二区三区仙踪林| 亚洲三级电影网站| 在线欧美日韩精品| 亚洲第一精品电影| 亚洲综合av一区二区三区| 免费在线观看成人av| 亚洲天堂影院在线观看| 日本激情在线观看| 97人人爽人人澡人人精品| 日本免费一区二区三区最新| 欧美成年人视频在线观看| 一区视频在线看| www.四虎影视.com| 国产日韩欧美三区| 北条麻妃av高潮尖叫在线观看| 久久人妻少妇嫩草av蜜桃| 蜜桃传媒一区二区亚洲av| 日日骚av一区二区| 亚洲 精品 综合 精品 自拍| 亚欧激情乱码久久久久久久久| 国产黄色高清视频| 亚洲欧美综合另类在线卡通| 手机成人av在线| 青草视频在线播放| 日本在线观看www| 亚洲福利影片在线| 9i看片成人免费看片| 免费在线看污| 日韩欧美在线免费观看视频| 久久黄色精品视频| 成人美女视频在线观看18| 一级毛片视频| 男女男精品视频站| 精品国产在天天线2019| 亚洲精品高清国产一线久久| 性色av浪潮av| 日韩精品一区二区三区三区免费| 国产免费无遮挡吸奶头视频| 久久久人成影片免费观看| 美国欧美日韩国产在线播放| 欧美精品一区二区三区高清aⅴ| 亚洲日本中文字幕免费在线不卡| 亚洲乱码国产乱码精品|