當前位置:首頁 » 編程語言 » php錯誤處理

php錯誤處理

發布時間: 2023-01-19 20:07:55

1. php 異常處理 總出現致命錯誤 無法捕獲異常

沒有錯啊?
上一個可以顯示,下一個你可能重寫了Exception,也應該沒錯。
難道你的PHP不支持異常?
Uncaught exception 'Exception' ,有這個,沒道理啊?

2. PHP代碼unexpected '錯誤的解決方法是什麼

  1. 你的 else 後面的括弧寫錯了 應該是 {,試試吧,我在後盾人看老師講的,希望能幫到你加油૧(●´৺`●)૭૧(●´৺`●)૭(=^▽^=)

  2. 自學黨們在自學php的時候,經常會發生一些小錯誤,這篇文章主要介紹了PHP常見的6個錯誤提示及解決方法,感興趣的小夥伴們可以參考一下

  3. 在php開發過程中,由於不知道向誰求助而心慌意亂地判斷以為自己不適合學php。其實錯誤在每個人學習過程中都會碰到的,千萬不要妄自菲薄。很多錯誤在報錯的代碼提示中已經告訴我們了,仔細看,不會就網路。現總結一些常見的php錯誤,以共享php新人。

Php常見錯誤提示

一、Fatal error: Call to undefined function……
函數不存在,可能的原因:
系統不存在這個函數且你也沒自定義
有人會問,我在別的機器上就不報錯。那是因為環境不同,這個函數在本機沒開,怎麼開?你網路函數名字,就能查到這個函數屬於哪個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

3. PHP將拋出一個錯誤問題,怎麼解決

首先要知道什麼是PHP異常?

異常(Exception)用於在指定的錯誤發生時改變腳本的正常流程。
PHP 5 提供了一種新的面向對象的錯誤處理方法。
異常處理用於在指定的錯誤(異常)情況發生時改變腳本的正常流程。這種情況稱為異常。

當異常被觸發時,通常會發生:

當前代碼狀態被保存
代碼執行被切換到預定義的異常處理器函數
根據情況,處理器也許會從保存的代碼狀態重新開始執行代碼,終止腳本執行,或從代碼中另外的位置繼續執行腳本
我們將展示不同的錯誤處理方法:

異常的基本使用
創建自定義的異常處理器
多個異常
重新拋出異常
設置頂層異常處理器
異常的基本使用
當異常被拋出時,其後的代碼不會繼續執行,PHP 會嘗試查找匹配的 「catch」 代碼塊。

如果異常沒有被捕獲,而且又沒用使用 set_exception_handler() 作相應的處理的話,那麼將發生一個嚴重的錯誤(致命錯誤),並且輸出 「Uncaught Exception」 (未捕獲異常)的錯誤消息。

讓我們嘗試拋出一個異常,同時不去捕獲它:
復制代碼 代碼如下:
<?php
//create function with an exceptionfunction
checkNum($number) {
if($number>1) {
throw new Exception(」Value must be 1 or below」);
} return true;
}
//trigger
exceptioncheckNum(2);
?>

上面的代碼會獲得類似這樣的一個錯誤:

Fatal error: Uncaught exception 『Exception' with message 『Value must be 1 or below' in C:\webfolder\test.php:6 Stack trace: #0 C:\webfolder\test.php(12): checkNum(28) #1 {main} thrown in C:\webfolder\test.php on line 6
Try, throw 和 catch
要避免上面例子出現的錯誤,我們需要創建適當的代碼來處理異常。

處理處理程序應當包括:

Try - 使用異常的函數應該位於 「try」 代碼塊內。如果沒有觸發異常,則代碼將照常繼續執行。但是如果異常被觸發,會拋出一個異常。
Throw - 這里規定如何觸發異常。每一個 「throw」 必須對應至少一個 「catch」
Catch - 「catch」 代碼塊會捕獲異常,並創建一個包含異常信息的對象
讓我們觸發一個異常:

<?php//創建可拋出一個異常的函數function checkNum($number) { if($number>1) { throw new Exception(」Value must be 1 or below」); } return true; }//在 「try」 代碼塊中觸發異常try { checkNum(2); //If the exception is thrown, this text will not be shown echo 『If you see this, the number is 1 or below'; }//捕獲異常catch(Exception $e) { echo 『Message: 『 .$e->getMessage(); }?>
上面代碼將獲得類似這樣一個錯誤:

Message: Value must be 1 or below
例子解釋:
上面的代碼拋出了一個異常,並捕獲了它:

創建 checkNum() 函數。它檢測數字是否大於 1。如果是,則拋出一個異常。
在 「try」 代碼塊中調用 checkNum() 函數。
checkNum() 函數中的異常被拋出
「catch」 代碼塊接收到該異常,並創建一個包含異常信息的對象 ($e)。
通過從這個 exception 對象調用 $e->getMessage(),輸出來自該異常的錯誤消息
不過,為了遵循「每個 throw 必須對應一個 catch」的原則,可以設置一個頂層的異常處理器來處理漏掉的錯誤。
創建一個自定義的 Exception 類
創建自定義的異常處理程序非常簡單。我們簡單地創建了一個專門的類,當 PHP 中發生異常時,可調用其函數。該類必須是 exception 類的一個擴展。

這個自定義的 exception 類繼承了 PHP 的 exception 類的所有屬性,您可向其添加自定義的函數。

我們開始創建 exception 類:
復制代碼 代碼如下:
<?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);
}
}catch (customException $e)
{
//display custom message
echo $e->errorMessage();
}?>

這個新的類是舊的 exception 類的副本,外加 errorMessage() 函數。正因為它是舊類的副本,因此它從舊類繼承了屬性和方法,我們可以使用 exception 類的方法,比如 getLine() 、 getFile() 以及 getMessage()。

例子解釋:
上面的代碼拋出了一個異常,並通過一個自定義的 exception 類來捕獲它:

customException() 類是作為舊的 exception 類的一個擴展來創建的。這樣它就繼承了舊類的所有屬性和方法。
創建 errorMessage() 函數。如果 e-mail 地址不合法,則該函數返回一條錯誤消息
把 $email 變數設置為不合法的 e-mail 地址字元串
執行 「try」 代碼塊,由於 e-mail 地址不合法,因此拋出一個異常
「catch」 代碼塊捕獲異常,並顯示錯誤消息
多個異常
可以為一段腳本使用多個異常,來檢測多種情況。

可以使用多個 if..else 代碼塊,或一個 switch 代碼塊,或者嵌套多個異常。這些異常能夠使用不同的 exception 類,並返回不同的錯誤消息:
復制代碼 代碼如下:
<?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 = 「[email protected]」;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(); }?>

例子解釋:
上面的代碼測試了兩種條件,如何任何條件不成立,則拋出一個異常:

customException() 類是作為舊的 exception 類的一個擴展來創建的。這樣它就繼承了舊類的所有屬性和方法。
創建 errorMessage() 函數。如果 e-mail 地址不合法,則該函數返回一個錯誤消息。
執行 「try」 代碼塊,在第一個條件下,不會拋出異常。
由於 e-mail 含有字元串 「example」,第二個條件會觸發異常。
「catch」 代碼塊會捕獲異常,並顯示恰當的錯誤消息
如果沒有捕獲 customException,緊緊捕獲了 base exception,則在那裡處理異常。
重新拋出異常
有時,當異常被拋出時,您也許希望以不同於標準的方式對它進行處理。可以在一個 「catch」 代碼塊中再次拋出異常。

腳本應該對用戶隱藏系統錯誤。對程序員來說,系統錯誤也許很重要,但是用戶對它們並不感興趣。為了讓用戶更容易使用,您可以再次拋出帶有對用戶比較友好的消息的異常:
復制代碼 代碼如下:
<?php
class customException extends Exception { public function errorMessage() {
//error message
$errorMsg = $this->getMessage().' is not a valid E-Mail address.'; return $errorMsg; } }$email = 「[email protected]」;try { try {
//check for 「example」 in mail address
if(strpos($email, 「example」) !== FALSE) {
//throw exception if email is not valid throw new
Exception($email); } } catch(Exception $e) {
//re-throw exception throw new
customException($email); } }catch (customException $e) {
//display custom message
echo $e->errorMessage(); }
?>

例子解釋:
上面的代碼檢測在郵件地址中是否含有字元串 「example」。如果有,則再次拋出異常:

customException() 類是作為舊的 exception 類的一個擴展來創建的。這樣它就繼承了舊類的所有屬性和方法。
創建 errorMessage() 函數。如果 e-mail 地址不合法,則該函數返回一個錯誤消息。
把 $email 變數設置為一個有效的郵件地址,但含有字元串 「example」。
「try」 代碼塊包含另一個 「try」 代碼塊,這樣就可以再次拋出異常。
由於 e-mail 包含字元串 「example」,因此觸發異常。
「catch」 捕獲到該異常,並重新拋出 「customException」。
捕獲到 「customException」,並顯示一條錯誤消息。
如果在其目前的 「try」 代碼塊中異常沒有被捕獲,則它將在更高層級上查找 catch 代碼塊。
設置頂層異常處理器 (Top Level Exception Handler)
set_exception_handler() 函數可設置處理所有未捕獲異常的用戶定義函數。
復制代碼 代碼如下:
<?php
function myException($exception){
echo 「<b>Exception:</b> 」 , $exception->getMessage();
}
set_exception_handler('myException');
throw new Exception('Uncaught Exception occurred');
?>

以上代碼的輸出應該類似這樣:

Exception: Uncaught Exception occurred
在上面的代碼中,不存在 「catch」 代碼塊,而是觸發頂層的異常處理程序。應該使用此函數來捕獲所有未被捕獲的異常。
異常的規則
需要進行異常處理的代碼應該放入 try 代碼塊內,以便捕獲潛在的異常。
每個 try 或 throw 代碼塊必須至少擁有一個對應的 catch 代碼塊。
使用多個 catch 代碼塊可以捕獲不同種類的異常。
可以在 try 代碼塊內的 catch 代碼塊中再次拋出(re-thrown)異常。
簡而言之:如果拋出了異常,就必須捕獲它。

4. PHP自定義門面以後顯示錯誤

如果您是PHP老手,當然知道當PHP腳本出錯時發生了什麼事情。此時PHP解析器將在屏幕上給出錯誤信息,如 Fatal error: Call to undefined function on line 19 --,因此程序在此處終止。這個信息會嚇到客戶,他可能立即打電話和你進行咨詢。
幸運的是,這里有解決辦法。PHP擁有內置工具,可以讓開發人員捕捉腳本錯誤然後將它們轉到自定義的錯誤處理器。此時則可以對處理器進行編程顯示更多關於錯誤的詳細信息。還可以將錯誤寫入文件或資料庫以採取補救措施。有時候還可以對處理器編寫程序忽略錯誤消息。
本文中,我將闡述如何使用PHP的錯誤處理API構建用戶自定義的錯誤處理器,並且說明如何以簡單而友好的方式顯示和管理腳本的錯誤信息。
錯誤類型和報告級別
我們從最基本的開始。PHP有三種最基本的錯誤類型,從低級到高級分別為:注意、警告和錯誤(或致命錯誤)。通常情況下,注意和警告不會終止程序;但是致命錯誤則是危險故障(例如,調用一個沒有定義的函數或參考一個不存在的對象),將導致程序中斷。這些錯誤有可能在啟動、解析、編譯或運行時發生。
關鍵字如E_NOTICE, E_ERROR等用於表明錯誤的不同類型和等級。在PHP手冊上可以獲得它們的詳細信息列表。
腳本階段錯誤顯示由error_reporting()函數進行控制。這一函數針對不同的錯誤等級設置不同的參數。表A給出了使用此函數報告警告和致命錯誤的腳本程序。
表A
<?php
// display warnings and errors
error_reporting(E_WARNING | E_ERROR);
// this will generate a notice, which will never be displayed
echo $undefinedVar;
// this will generate a fatal error, which will be displayed
callUndefFunc();
?>
將表B中的代碼與上面的進行比較發現,Listing B中隱藏錯誤信息甚至隱藏致命信息,使得錯誤信息不會被顯示出來。
表B
<?php
// turn off error display
// no errors will be displayed
error_reporting(0);
// this will generate a notice
echo $undefinedVar;
// this will generate a fatal error
callUndefFunc();
?>
表C中的代碼將所有錯誤信息甚至簡單的注意事項都顯示出來:
表C
<?php
// all errors will be displayed
error_reporting(E_ALL);
// this will generate a notice
echo $undefinedVar;
// this will generate a fatal error
callUndefFunc();
?>
如以上3個例子所示,error_reporting()函數在控制錯誤發生時,在屏幕上顯示內容非常重要。這里的關鍵字是displayed,其表達的意思是錯誤不被顯示而不是錯誤沒有發生。因此,發生致命錯誤時(例如不正確的函數調用),程序將被終止;但是,此時沒有任何消息顯示給用戶。
下面的例子(表 D)說明了這種情況:
表D
<?php
// no errors will be displayed
error_reporting(0);
// start a task
echo "Starting task...";
// call an undefined function
// a fatal error occurs ring task processing
callMe();
// end the task
echo "Successfully completed task...";
?>
在表D中,在調用echo()函數時發生了致命錯誤,程序執行時到這點被終止,但是卻沒有任何錯誤消息給出,用戶不知道這種情況還以為程序在正確運行。下面的結論是非常明顯的:不給出錯誤報告非常危險,因為不論過程是否完成它常導致不正確的結論。
注意:調用不帶任何參數的error_reporting()將返回當前的錯誤報告等級。
自定義錯誤處理器
很明顯,隱藏錯誤報告是不正確的,你肯定想知道有什麼其他辦法加以改進。自定義錯誤處理器就是一個很好的能取代PHP默認錯誤處理系統的解決方法。自定義錯誤處理器可以以任何方式設置處理錯誤信息,包括信息如何顯示。
PHP函數中,完成這一功能的是set_error_handler()函數。錯誤發生時,此函數被自動調用,然後給出4個參數:錯誤代碼、錯誤消息、發生錯誤的腳本名稱和錯誤出現的行,此函數對錯誤管理負責。
表E給出一個簡單例子:
表E
<?php
// define custom handler
set_error_handler('myHandler');
// custom handler code
function myHandler($code, $msg, $file, $line) {
echo "Just so you know, something went wrong at line $line of your script $file. The system says that the error code was $code, and the reason for the error was: $msg. Sorry about this!";
}
// generate a notice
echo $undefVar;
?>
當運行此腳本的時候,會出現下面的信息:
Just so you know, something went wrong at line 11 of your /dev/error1.php. The system says that the error code was 8, and the reason for the error was: Undefined variable: undefVar. Sorry about this!
此時,PHP的默認錯誤處理器被用戶定義的myHandler()函數所取代,$undefVar變數被激活,PHP通知未定義變數的信息,此信息在運行時引擎產生,然後傳遞給myHandler()函數,同時錯誤發生的地址也傳遞給此函數。然後myHandler()函數輸出友好信息解釋錯誤。
注意:錯誤和致命錯誤很重要,它們會繞過自定義錯誤處理器,然後以PHP默認的錯誤處理機制進行顯示。顯示這些信息可使用前面討論的標准error_reporting()函數進行控制。
例1:動態錯誤頁面和e-mail警報
表F給出了另一個範例,當發生錯誤時,將動態產生HTML錯誤頁面,並且通過e-mail向Web管理員進行報告。
表F
<?php
// define custom handler
set_error_handler('myHandler');
// custom handler code
function myHandler($code, $msg, $file, $line, $context) {
// print error page
echo "<html><head></head><body>";
echo "<h2 align=center>Error!</h2>";
echo "<font color=red size=+1>";
echo "An error occurred while processing your request. Please visit our <a href=http://www.domain.dom>home page</a> and try again.";
echo "</font>";
echo "</body></html>";
// email error to admin
$body = "$msg at $file ($line), timed at " . date ("d-M-Y h:i:s", mktime());
$body .= "nn" . print_r($context, TRUE);
mail ("[email protected]", "Web site error", $body);
// halt execution of script
die();
}
// generate a notice
echo $undefVar;
?>
這里,自定義的錯誤處理器在遇到錯誤時動態產生HTML錯誤頁面。此錯誤信息也能被e-mail信息捕獲,然後通過PHP內置的mail()函數發送給管理員。
這里出現了myHandler()函數的一個新參數$context。這是myHandler()函數的第五個參數,是可選項。它包含了當前變數狀態的快照。包括對管理員有用的上下文信息,有利於減少調試時間。

5. PHP寫的頁面無法訪問,報HTTP500錯誤,這個是怎麼回事

原因百分之80來自於網站根目錄的config.php文件中資料庫相關設定錯誤,這種錯誤排除,只要檢查一下config.php文件中的伺服器和資料庫名稱、使用者名稱、密碼,還有資料庫前綴字串,再來就是檔案文件路徑,只要是多一個或少一個符號、大小寫錯誤、空格…絕對會賞你一個[HTTP 500 內部伺服器發生錯誤]的排頭吃。

再來百分之10的錯誤來自於網站程式碼設計錯誤也會出現[HTTP 500 內部伺服器發生錯誤]的頁面,這個錯誤一來可以從視窗工具=>網際網路選項=>進階=>去掉勾選:顯示易懂的HTTP錯誤訊息,二來可以從網站根目錄的error_log紀錄中看出一些端倪,再來排除,還有百分之5剛好碰上訪問的網站在維護,最多的例子是網站升級和網站遷移。
將錯誤訊息顯示出來。

而顯示的方法有兩種,一種是設定php.ini;另一種是透過程式碼開啟,操作方法請參考以下:
一、設定php.ini

1.首先開啟php.ini檔

2.使用「Ctrl」+「F」搜尋【display_errors】

3.將「display_errors=Off」改為「display_errors=On」

4.重新啟動Apache

5.重啟開啟網頁

二、透過程式碼開啟

1.開啟顯示「伺服器錯誤(500)」的程式檔

2.於程式檔加入以下程式碼

ini_set("display_errors", "On"); // 設定是否顯示錯誤( On=顯示, Off=隱藏 )

3.重啟開啟網頁

6. 護衛神PHP套件出現"FastCGI"等錯誤怎麼解決

錯誤一: 處理程序「FastCGI」在其模塊列表中有一個錯誤模塊「FastCgiMole」。

英文系統提示:Handler 「FastCGI」 has a bad mole 「FastCgiMole」 in its mole list。

原因分析:這個主要是沒有安裝應用程序開發功能。
解決辦法:把應用程序開發功能選擇上就可以了,PHP的CGI版本,CGI的功能是必須選擇的。

錯誤二:模塊IsapiMole通知ExecuteRequestHandler處理程序PHP-Handler錯誤代碼0x800700
或 處理程序「AboMapperCustom-5095705」在其模塊列表中有一個錯誤模塊「IsapiMole」

原因分析:沒有安裝ISAPI擴展。
解決辦法:在IIS安裝ISAPI擴展即可。

錯誤三:The FastCGI Handler was unable to process the request.

原因分析:這種多出現於PHP升級,一般是你升級前的PHP.ini存放在C:\windows\system32\php.ini
解決辦法:刪除C:\windows\system32\php.ini,並重啟IIS。

錯誤四:

解決辦法:這個可能是許可權不足導致的,在網站根目錄的上一級目錄加Users的讀許可權即可。
錯誤五:
錯誤提示:Unable to place a FastCGI process in a JobObject. Try disabling the Application Pool CPU Limit feature

原因分析:IIS開啟了程序池的CPU限制,而FastCGI模式的PHP不支持CPU限制。
解決辦法:取消程序池CPU限制,或使用ISAPI模式的PHP。

錯誤六:
安裝PHP7.0套件出現錯誤「FastCGI進程意外退出」,雙擊「php-cgi.exe」出現提示「無法啟動此程序,因為計算機中丟失 api-ms-win-crt-stdio-l1-1-0.dll。嘗試重新安裝該程序以解決此問題。」,如圖:

原因分析:出現此種情況,是因為伺服器無法安裝VC++ 2015運行庫,導致php運行環境不具備,因此出錯。
解決辦法:據分析,出現此種情況的解決辦法最好就是重裝系統,並且更換操作系統,如果還不行,建議打SP1補丁。

熱點內容
java返回this 發布:2025-10-20 08:28:16 瀏覽:585
製作腳本網站 發布:2025-10-20 08:17:34 瀏覽:881
python中的init方法 發布:2025-10-20 08:17:33 瀏覽:574
圖案密碼什麼意思 發布:2025-10-20 08:16:56 瀏覽:761
怎麼清理微信視頻緩存 發布:2025-10-20 08:12:37 瀏覽:677
c語言編譯器怎麼看執行過程 發布:2025-10-20 08:00:32 瀏覽:1005
郵箱如何填寫發信伺服器 發布:2025-10-20 07:45:27 瀏覽:249
shell腳本入門案例 發布:2025-10-20 07:44:45 瀏覽:108
怎麼上傳照片瀏覽上傳 發布:2025-10-20 07:44:03 瀏覽:799
python股票數據獲取 發布:2025-10-20 07:39:44 瀏覽:705