本文目錄一覽:
PHP中處理異常有幾種方式?請詳述
php中異常處理方法總結:
當異常被觸發時,通常會發生:
在PHP5中添加了類似於其它語言的錯誤異常處理模塊。在 PHP代碼中所產生的異常可被 throw語句拋出並被 catch 語句捕獲。需要進行異常處理的代碼都必須放入 try 代碼塊內,以便捕獲可能存在的異常。每一個 try 至少要有一個與之對應的 catch。使用多個 catch 可以捕獲不同的類所產生的異常。當 try 代碼塊不再拋出異常或者找不到 catch 能匹配所拋出的異常時,PHP 代碼就會在跳轉到最後一個 catch 的後面繼續執行。當然,PHP 允許在 catch 代碼塊內再次拋出(throw)異常。當一個異常被拋出時,其後(譯者註:指拋出異常時所在的代碼塊)的代碼將不會繼續執行,而 PHP 就會嘗試查找第一個能與之匹配的 catch。如果一個異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應的處理的話,那麼 PHP 將會產生一個嚴重的錯誤,並且輸出 Uncaught Exception … (未捕獲異常)的提示信息。
1、異常類的層級關係:
代碼如下 複製代碼
class NotFoundException extends Exception{}
class InputException extends Exception{}
class DBException extends Exception{}
2、配置未捕捉異常的處理器:
代碼如下 複製代碼
function exception_uncaught_handler(Exception $e) {
header(‘Content-type:text/html; charset=utf-8’);
if ($e instanceof NotFoundException)
exit($e-getMessage());
elseif ($e instanceof DBException)
exit($e-getMessage());
else
exit($e-getMessage());
}
set_exception_handler(‘exception_uncaught_handler’);
3、在數據庫連接代碼,手動拋出DBException異常但未使用try…catch進行捕獲處理,該異常將被PHP自定義異常處理器
代碼如下 複製代碼
exception_uncaught_handler()函數處理:
$this-resConn = mysql_connect ($CONFIGS[‘db_host’], $CONFIGS[‘db_user’], $CONFIGS[‘db_pwd’]);
if (false == is_resource($this-resConn))
throw new DBException(‘數據庫連接失敗。’.mysql_error($this-resConn));
4、業務邏輯一瞥:
if (0 != strcmp($curAlbum-interest_id, $it))
throw new NotFoundException(‘很抱歉,你所訪問的相冊不存在’);
以上就是PHP自定義異常處理器的具體使用方法
實例
代碼如下 複製代碼
?php
class customException extends Exception
{
public function errorMessage()
{
//error message
$errorMsg = ‘Error on line ‘.$this-getLine().’ in ‘.$this-getFile()
.’: b’.$this-getMessage().’/b is not a valid E-Mail address’;
return $errorMsg;
}
}
$email = “someone@example.com”;
try
{
//check if
if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE)
{
//throw exception if email is not valid
throw new customException($email);
}
//check for “example” in mail address
if(strpos($email, “example”) !== FALSE)
{
throw new Exception(“$email is an example e-mail”);
}
}
catch (customException $e)
{
echo $e-errorMessage();
}
catch(Exception $e)
{
echo $e-getMessage();
}
?
例子解釋:
上面的代碼測試了兩種條件,如何任何條件不成立,則拋出一個異常:
1.customException() 類是作為舊的 exception 類的一個擴展來創建的。這樣它就繼承了舊類的所有屬性和方法。
2.創建 errorMessage() 函數。如果 e-mail 地址不合法,則該函數返回一個錯誤消息。
3.執行 “try” 代碼塊,在第一個條件下,不會拋出異常。
4.由於 e-mail 含有字符串 “example”,第二個條件會觸發異常。
5.”catch” 代碼塊會捕獲異常,並顯示恰當的錯誤消息
如果沒有捕獲 customException,緊緊捕獲了 base exception,則在那裡處理異常。
重新拋出異常
有時,當異常被拋出時,您也許希望以不同於標準的方式對它進行處理。可以在一個 “catch” 代碼塊中再次拋出異常。
代碼如下 複製代碼
?php
/*
*/
/*
* 總結:PHP異常的使用方法分三步:
* 第一步:定義異常類,如果不定義就用系統默認的異常類;
* 第二步:當出現異常時用 throw 拋出異常,例如 ex1($num2);異常的參數是$num2用該異常的getMessage()獲取;
* 第三步:觸發異常,用try子句,當滿足條件時 throw new ex1($num);
* 第四步:catch捕獲異常 catch (ex2 $e),相當於實例化一個定義好的異常類ex2為$e;
*
* 注意,異常可以定義多個,但是只能觸發一個,也就是說只能用catch捕獲一個異常
*/
//================基本異常類
//創建可拋出一個異常的函數
function num($num){
if ($num1){//異常拋出條件
$msg=」數值不能大於1″;//異常提示信息
throw new Exception($msg);//拋出異常
}
echo 「數值小於1″;
}
//在 「try」 代碼塊中觸發異常
try {
num(3);
echo 「執行正常」;
}
//捕獲異常
catch (Exception $e){
echo 「錯誤信息:」.$e-getMessage();//Exception()的系統方法獲取異常信息
echo 「錯誤文件:」.$e-getFile();//Exception()的系統方法獲取異常文件名
echo 「行數:」.$e-getLine();//Exception()的系統方法獲取異常行數
}
//======================================================================
echo 「br========================================================br」;
//擴展基本異常類
function checkEmail($email){//定義一個可以拋出異常的判斷EMAIL合法性的函數
if (filter_var($email,FILTER_VALIDATE_EMAIL)==false){
throw new checkEmailException($email);//拋出異常用EMAIL做參數
}
echo 「郵件合法」;
}
class checkEmailException extends Exception{//定義擴展異常類
public function errormsg(){
$msg=」錯誤原因:」.$this-getMessage().」不是一個合法的EMAIL地址!」;
$msg.=」錯誤文件名:」.$this-getFile();
$msg.=」錯誤行數:」.$this-getLine();
echo $msg;
}
}
$email=」email…..@chhua.com「;
try {//觸發異常
checkEmail($email);
}
//捕獲異常
catch (checkEmailException $e){
$e-errormsg();
}
//==================================多個異常的捕獲
echo 「br===================================================br」;
class ex1 extends Exception{//定義一個異常類
public function msg(){
$msg=」錯誤原因:」.$this-getMessage().」大於100br」;
$msg.=」錯誤文件:」.$this-getFile().」Br」;
$msg.=」錯誤代碼:」.$this-getCode().」br」;
$msg.=」行數:」.$this-getLine().」br」;
echo $msg;
}
}
class ex2 extends Exception{//定義一個異常類
public function msg(){
$msg=」錯誤原因:」.$this-getMessage().」等於100br」;
$msg.=」錯誤文件:」.$this-getFile().」Br」;
$msg.=」行數:」.$this-getLine().」br」;
echo $msg;
}
}
$num2=100;
try {
if ($num2100){//當條件滿足時觸發
throw new ex1($num2);
}
if ($num2==100){//當條件滿足時觸發
throw new ex2($num2);
}
}
catch (ex2 $e){//捕獲觸發的異常
$e-msg();
}
catch (ex1 $e){//捕獲觸發的異常
$e-msg();
}
/*
* 總結:PHP異常的使用方法分三步:
* 第一步:定義異常類,如果不定義就用系統默認的異常類;
* 第二步:當出現異常時用 throw 拋出異常,例如 ex1($num2);異常的參數是$num2用該異常的getMessage()獲取;
* 第三步:觸發異常,用try子句,當滿足條件時 throw new ex1($num);
* 第四步:catch捕獲異常 catch (ex2 $e),相當於實例化一個定義好的異常類ex2為$e;
*
* 注意,異常可以定義多個,但是只能觸發一個,也就是說只能用catch捕獲一個異常
*/
?
PHP新手NOTICE錯誤常見解決方法
剛學習PHP,不久,一般就看看手冊,和一本叫PHP和mysql
web開發的。
最近在整留言板,剛才遇到個問題。
頁面中,好多類似
Notice:
Use
of
undefined
constant
title
–
assumed
‘title’
in
D:\wamp\www\phpmysqlweb\bbs\list.php
on
line
17
頁面很難看,很糾結啊,我用的是wamp集成包。
百度了下,看來好多朋友也有這個情況。
Notice意思是使用了沒有被聲明的變量,但是程序不會影響使用。難怪還是能正常運行的,就是不雅觀。
解決辦法有4個:
1:在上面初始化
2:打開php.ini文件
修改配置文件
error_reporting設置:
找到error_reporting=E_ALL
修改為error_reporting=E_ALL
~E_NOTICE
3:用include把
error_reporting(E_ALL
~E_NOTICE);寫進去
//天空就是這麼乾的,因為是個懶人,怕打開這個那個,嘻嘻。。。。。
4:直接在文件最上面加個error_reporting(0);
準備好好搞PHP,不過遇上這個奇怪問題,還有咱有百度,神馬問題,百度下,都有解決了。
新手朋友們注意了,當頁面報什麼錯誤的時候,檢查代碼,是否缺分號或者括號的,剛才我就犯了那些粗心問題,慚愧。
我的PHP之路註定是困難的,但是我不會放棄,一定要好好做。加油。
php實際開發怎麼處理錯誤
在php開發過程中,由於不知道向誰求助而心慌意亂地判斷以為自己不適合學php。其實錯誤在每個人學習過程中都會碰到的,千萬不要妄自菲薄。很多錯誤在報錯的代碼提示中已經告訴我們了,仔細看,不會就百度。現總結一些常見的php錯誤,以共享php新人。
Php常見錯誤提示
一、Fatal error: Call to undefined function……
函數不存在,可能的原因:
1、系統不存在這個函數且你也沒自定義
2、有人會問,我在別的機器上就不報錯。那是因為環境不同,這個函數在本機沒開,怎麼開?你百度函數名字,就能查到這個函數屬於哪個dll,去php.ini里開啟。
實例講解:PHP FATAL ERROR: CALL TO UNDEFINED FUNCTION BCMUL()解決辦法
在一台處理網絡支付的服務器遷移的時候,發現不能支付。
PHP環境:
PHP版本為5.3.3
系統為Red Hat 4.1.2-54
查看apache的錯誤日誌,發現是加密文件中一個函數bcmul()報錯:
複製代碼 代碼如下:PHP Fatal error: Call to undefined function bcmul() in /php_rsa.php on line xxx
解決辦法:
使用如下命令:
複製代碼 代碼如下:yum install php-bcmath
就安裝好了。
如果出現下面這種情況:
複製代碼 代碼如下:
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.yun-idc.com
* extras: mirrors.yun-idc.com
* rpmforge:
* updates: mirrors.yun-idc.com
Setting up Install Process
Resolving Dependencies
— Running transaction check
— Package php-bcmath.x86_64 0:5.1.6-40.el5_9 set to be updated
— Processing Dependency: php-common = 5.1.6-40.el5_9 for package: php-bcmath
— Running transaction check
— Package php-common.x86_64 0:5.1.6-40.el5_9 set to be updated
— Processing Conflict: php53-common conflicts php-common
— Finished Dependency Resolution
php53-common-5.3.3-13.el5_9.1.x86_64 from installed has depsolving problems
— php53-common conflicts with php-common
Error: php53-common conflicts with php-common
You could try using –skip-broken to work around the problem
You could try running: package-cleanup –problems
package-cleanup –dupes
rpm -Va –nofiles –nodigest
就需要使用yum update 之後再yum install php53-bcmath就好了
順便了解了一下,bcmath這個函數是PHP數學擴展中的一個。可以使用 bcscale() 來設置全局默認的小數位數,具體用法如下:
複製代碼 代碼如下:string bcmul ( string $left_operand , string $right_operand [, int $scale ] )
例子:
?php echo bcmul(‘1.34747474747′, ’35’, 3); // 47.161 echo bcmul(‘2’, ‘4’); // 8 ?
此函數在php.ini中的選項:
複製代碼 代碼如下:
[bcmath]
; Number of decimal digits for all bcmath functions.
;
bcmath.scale = 0
二、syntax error, unexpected T_STRING, expecting……
嚴重語法錯誤,例如syntax error, unexpected T_STRING, expecting ‘,’ or ‘;’ in F:\phpnow\htdocs\index.php on line 4
後邊標着行號,自己去檢查那一行的標點就行
如果是 第三行 echo 1 後邊沒加;,報錯會報 on line 4 ,on line 4,就是第四行
實例講解:
其實,這是一個非常容易解決掉的問題。在我看來,似曾相識,呵呵,最近學JavaScript可是學會了使用var聲明變量。
其實,在PHP中根本不需要使用var聲明的,但是當一個變量作為一個類的成員變量的時候,使用var還是沒有問題的。
在外部使用var就報錯Parse error: syntax error, unexpected T_VAR in…,例如我的出錯信息:
Parse error: syntax error, unexpected T_VAR in D:\Apache2.2\htdocs\shirdrn\page\p2\pageUtil.inc on line 34
我在測試:在一個類的內部,使用一個自己定義的類對象作為這個類的成員時,出錯了。
Address類對應的address.inc代碼:
?php class Address { var $road; function Address(){} function setRoad($road){ $this-road = $road; } } ?
Person類及其測試代碼為person.php如下:
?php require(“address.inc”); class Person { var $name; var $address; function Person(){ } function display(){ echo “Name : “.$this-name.”BR”; echo “Road : “.$this-address-road.”BR”; } } var $p = new Person(); $p-address = new Address(); $p-address-setRoad(“Chagnchun Road”); $p-name = “Shirdrn”; $p-display(); ?
測試輸出現異常:
Parse error: syntax error, unexpected T_VAR in D:\Apache2.2\htdocs\shirdrn\page\p2\pageUtil.inc on line 34
就是因為在person.php代碼中使用var聲明變量,PHP中是不能這樣的,只要使用「$」符號起始就表示這個字符後面的是一個PHP變量。
呵呵:-)
其它網友的補充方法:
問題解決:syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or 前兩天開始自己php之旅,做一個很普通的網站,結果我們的php是5.0版本,服務器是4.0版本,納悶死咯。 昨天忙了一天,今天早上一來,在一篇文章發現了,解決方法。Parse error: syntax error, unexpected T_STRING, expecting T_OLD_FUNCTION or T_FUNCTION or T_VAR or ‘}’ ,如果有「public」,就將「public」去掉。就不會出錯,如果「public」 是定義變量的話,將「public」 改為「var」。
三、Parse error: syntax error, unexpected T_VARIABLE in XXX.php on line XXX
這條語句是PHP常見的報錯,一般是在XXX行的上一行,或者是XXX行,缺少分號。或者在雙引號中使用雙引號,且沒有轉義等等。
解決方法:找到XXX.php的XXX行,按照上面的分析,找到自己的錯誤,改正即可。
貼士:作為編程人員,要做到代碼嚴謹,思維清晰,並且細心。人非聖賢孰能無過,但盡量避免這些因為粗心出現的錯誤,這樣才能成為合格的程序員。
四、Parse error: syntax error, unexpected ‘X’ in XXX.php on line XXX
這條語句依然是PHP常見的報錯,報錯原因是在XXX.php的XXX行,出現了PHP無法識別的字符。常常是因為function,if等需要『{‘、『}’的地方沒有閉合,或者在編程的時候,不小心在『;’的後面誤打了幾個字符。
解決方法:找到XXX.php的XXX行,刪除多出的字符,添加缺少的字符即可。
五、syntax error, unexpected $end
邏輯忘了閉合 這個報錯還有個特徵,他會提示你最後一行代碼報錯,譬如你一共30行,他就告訴你 on line 30,這時候你別檢查第三十行,你要把30行挨個,檢查一遍,看看哪個標籤沒閉合。
一共3000行,他就告訴你 on line 3000,這時候你別檢查這3000行了,如果你程序排版很亂,在3000行里找哪個括號是個很麻煩的事……我教你一招:ctrl+a ctrl+d alt+f4
好了,你現在可以重寫了。
另一種思路:
Parse error: syntax error, unexpected $end in script.php on line xx
調試了一會後發現產生錯誤的行是文件中間某行
//$str .= “?\n”;
想起來了 PHP 解釋器允許的結尾標記那行還可以用單行注釋,即 //$str .= “?\n”; 被解釋成結尾標記前有注釋,注釋的內容是 //$str .= “,而 ? 後面的 \n”; 會被解釋作 PHP 塊外的內容按 HTML 輸出出去!結果是給 $str .= “?\n”; 這行添加 // 成注釋後,反而多了個 ? 的結束標記,造成原來真正的結束標記成了意料之外的(unexpected)了。
解決辦法就是直接刪掉這一行即可。
PHP 開始和結束標記所在行別寫其它東西,是個好習慣。
六、Notice:Undefined varialbe:……
這是一個比較常見的錯誤,解決方法:error_reporting調整錯誤級別,
以上就是為大家分享的PHP常見的6個錯誤提示,給大家提供了大概的解決思路和方向,希望對大家的學習有所幫助。
原創文章,作者:JPDYT,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/317736.html