php錯誤處理

来源:http://www.cnblogs.com/manongjc/archive/2016/04/02/5347994.html
-Advertisement-
Play Games

在 PHP 中,預設的錯誤處理很簡單。一條錯誤消息會被髮送到瀏覽器,這條消息帶有文件名、行號以及描述錯誤的消息。 PHP 錯誤處理 在創建腳本和 Web 應用程式時,錯誤處理是一個重要的部分。如果您的代碼缺少錯誤檢測編碼,那麼程式看上去很不專業,也為安全風險敞開了大門。 本教程介紹了 PHP 中一些 ...


在 PHP 中,預設的錯誤處理很簡單。一條錯誤消息會被髮送到瀏覽器,這條消息帶有文件名、行號以及描述錯誤的消息。

PHP 錯誤處理

在創建腳本和 Web 應用程式時,錯誤處理是一個重要的部分。如果您的代碼缺少錯誤檢測編碼,那麼程式看上去很不專業,也為安全風險敞開了大門。

本教程介紹了 PHP 中一些最為重要的錯誤檢測方法。

我們將為您講解不同的錯誤處理方法:

  • 簡單的 "die()" 語句
  • 自定義錯誤和錯誤觸發器
  • 錯誤報告

 

基本的錯誤處理:使用 die() 函數

第一個實例展示了一個打開文本文件的簡單腳本:

<?php
$file=fopen("welcome.txt","r");
?>

如果文件不存在,您會得到類似這樣的錯誤:

Warning: fopen(welcome.txt) [function.fopen]: failed to open stream:
No such file or directory in C:webfoldertest.php on line 2

為了避免用戶得到類似上面的錯誤消息,我們在訪問文件之前檢測該文件是否存在:

<?php
if(!file_exists("welcome.txt"))
{
die("File not found");
}
else
{
$file=fopen("welcome.txt","r");
}
?>

現在,如果文件不存在,您會得到類似這樣的錯誤消息:

File not found

相比之前的代碼,上面的代碼更有效,這是由於它採用了一個簡單的錯誤處理機制在錯誤之後終止了腳本。

然而,簡單地終止腳本並不總是恰當的方式。讓我們研究一下用於處理錯誤的備選的 PHP 函數。

 

創建自定義錯誤處理器

創建一個自定義的錯誤處理器非常簡單。我們很簡單地創建了一個專用函數,可以在 PHP 中發生錯誤時調用該函數。

該函數必須有能力處理至少兩個參數 (error level 和 error message),但是可以接受最多五個參數(可選的:file, line-number 和 error context):

語法

error_function(error_level,error_message,error_file,error_line,error_context)

 

參數描述
error_level 必需。為用戶定義的錯誤規定錯誤報告級別。必須是一個數字。參見下麵的表格:錯誤報告級別。
error_message 必需。為用戶定義的錯誤規定錯誤消息。
error_file 可選。規定錯誤發生的文件名。
error_line 可選。規定錯誤發生的行號。
error_context 可選。規定一個數組,包含了當錯誤發生時在用的每個變數以及它們的值。

 

錯誤報告級別

這些錯誤報告級別是用戶自定義的錯誤處理程式處理的不同類型的錯誤:

常量描述
2      E_WARNING 非致命的 run-time 錯誤。不暫停腳本執行。
8 E_NOTICE run-time 通知。在腳本發現可能有錯誤時發生,但也可能在腳本正常運行時發生。
256 E_USER_ERROR 致命的用戶生成的錯誤。這類似於程式員使用 PHP 函數 trigger_error() 設置的 E_ERROR。
512 E_USER_WARNING 非致命的用戶生成的警告。這類似於程式員使用 PHP 函數 trigger_error() 設置的 E_WARNING。
1024 E_USER_NOTICE 用戶生成的通知。這類似於程式員使用 PHP 函數 trigger_error() 設置的 E_NOTICE。
4096 E_RECOVERABLE_ERROR 可捕獲的致命錯誤。類似 E_ERROR,但可被用戶定義的處理程式捕獲。(參見 set_error_handler())
8191 E_ALL 所有錯誤和警告。(在 PHP 5.4 中,E_STRICT 成為 E_ALL 的一部分)

現在,讓我們創建一個處理錯誤的函數:

function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}

上面的代碼是一個簡單的錯誤處理函數。當它被觸發時,它會取得錯誤級別和錯誤消息。然後它會輸出錯誤級別和消息,並終止腳本。

現在,我們已經創建了一個錯誤處理函數,我們需要確定在何時觸發該函數。

 

設置錯誤處理程式

PHP 的預設錯誤處理程式是內建的錯誤處理程式。我們打算把上面的函數改造為腳本運行期間的預設錯誤處理程式。

可以修改錯誤處理程式,使其僅應用到某些錯誤,這樣腳本就能以不同的方式來處理不同的錯誤。然而,在本例中,我們打算針對所有錯誤來使用我們自定義的錯誤處理程式:

set_error_handler("customError");

由於我們希望我們的自定義函數能處理所有錯誤,set_error_handler() 僅需要一個參數,可以添加第二個參數來規定錯誤級別。

實例

通過嘗試輸出不存在的變數,來測試這個錯誤處理程式:

<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr";
}

//set error handler
set_error_handler("customError");

//trigger error
echo($test);
?>

以上代碼的輸出如下所示:

Error: [8] Undefined variable: test

 

觸發錯誤

在腳本中用戶輸入數據的位置,當用戶的輸入無效時觸發錯誤是很有用的。在 PHP 中,這個任務由 trigger_error() 函數完成。

實例

在本例中,如果 "test" 變數大於 "1",就會發生錯誤:

<?php
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below");
}
?>

以上代碼的輸出如下所示:

Notice: Value must be 1 or below
in C:webfoldertest.php on line 6

您可以在腳本中任何位置觸發錯誤,通過添加的第二個參數,您能夠規定所觸發的錯誤級別。

可能的錯誤類型:

  • E_USER_ERROR - 致命的用戶生成的 run-time 錯誤。錯誤無法恢復。腳本執行被中斷。
  • E_USER_WARNING - 非致命的用戶生成的 run-time 警告。腳本執行不被中斷。
  • E_USER_NOTICE - 預設。用戶生成的 run-time 通知。在腳本發現可能有錯誤時發生,但也可能在腳本正常運行時發生。

在本例中,如果 "test" 變數大於 "1",則發生 E_USER_WARNING 錯誤。如果發生了 E_USER_WARNING,我們將使用我們自定義的錯誤處理程式並結束腳本:

<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Ending Script";
die();
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

以上代碼的輸出如下所示:

Error: [512] Value must be 1 or below
Ending Script

現在,我們已經學習瞭如何創建自己的 error,以及如何觸發它們,接下來我們研究一下錯誤記錄。

 

錯誤記錄

在預設的情況下,根據在 php.ini 中的 error_log 配置,PHP 向伺服器的記錄系統或文件發送錯誤記錄。通過使用 error_log() 函數,您可以向指定的文件或遠程目的地發送錯誤記錄。

通過電子郵件向您自己發送錯誤消息,是一種獲得指定錯誤的通知的好辦法。

 

通過 E-Mail 發送錯誤消息

在下麵的例子中,如果特定的錯誤發生,我們將發送帶有錯誤消息的電子郵件,並結束腳本:

<?php
//error handler function
function customError($errno, $errstr)
{
echo "<b>Error:</b> [$errno] $errstr<br>";
echo "Webmaster has been notified";
error_log("Error: [$errno] $errstr",1,
"[email protected]","From: [email protected]");
}

//set error handler
set_error_handler("customError",E_USER_WARNING);

//trigger error
$test=2;
if ($test>1)
{
trigger_error("Value must be 1 or below",E_USER_WARNING);
}
?>

以上代碼的輸出如下所示:

Error: [512] Value must be 1 or below
Webmaster has been notified

接收自以上代碼的郵件如下所示:

Error: [512] Value must be 1 or below

這個方法不適合所有的錯誤。常規錯誤應當通過使用預設的 PHP 記錄系統在伺服器上進行記錄。

原文地址:http://www.manongjc.com/php/php_error.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、WCF概述 1) 什麼是WCF? Windows Communication Foundation (WCF) 是用於構建面向服務的應用程式的框架。藉助 WCF,可以將數據作為非同步消息從一個服務終結點發送至另一個服務終結點。服務終結點可以是由 IIS 承載的持續可用的服務的一部分,也可以是應用程 ...
  • 先看圖,這是幾個月前用NPOI寫的導出數據到Excel,用了上百行代碼,而且難控制,導出來也比較難看 excel打開的效果 下麵是我用ExcelReport類庫導出到Excel的操作 1.首先引用ExcelReport類庫,使用NuGet即可 2.現在就可以寫導出的代碼,ExcelReport已經提 ...
  • C#數據進行顯示轉換時有可能會出現溢出的情況這時可以用關鍵字checked進行檢查是否溢出: checked(<expression>) 檢查溢出 unchecked(<expression>) 不檢查溢出 如果使用checked檢查溢出,一旦溢出就會拋出System.OverflowExcepti ...
  • 開始設置視窗的具體的位置的時候,我就只能通過在windows的屬性設置的StartPosition直接隨便設置為CenterScreen,這樣也挺方便的,直接居中顯示咯。 可是後面出現了另一個問題,就是我其他的窗體,我想指定他在某個具體的位置出現,查了好久才知道StartPosition的Manua ...
  • "Microsoft Build 2016 Day 1 記錄" Microsoft Build 2016 進行到了第二天,我覺得這一天的內容非常精彩,因為主要和開發者相關
  • WordPress編輯器對SVG的支持一向是非常的不友好,首先它不能上傳SVG文件,也不能自動的嵌入到內容中讓它正常顯示。同時,對內聯SVG代碼根本不識別,會無情的將SVG代碼自動刪除。 在上一篇文章中我介紹瞭如何讓Wordpress支持上傳SVG圖片的方法,似乎是部分的解決了這個問題。最近在開發過 ...
  • 註:本文參考自 http://www.jianshu.com/p/0465a2b837d2 swagger用於定義API文檔。 好處: 前後端分離開發 API文檔非常明確 測試的時候不需要再使用URL輸入瀏覽器的方式來訪問Controller 傳統的輸入URL的測試方式對於post請求的傳參比較麻煩 ...
  • 最近這幾天,一直在思考寫伺服器的時候怎麼做資料庫的讀寫服務,用什麼架構來做這個事情,現在終於有了一個大概的想法,用redis+mysql的方法。 目前業內有兩種思路,一種是full-mem模式,即全用redis存儲這種方式。另外一種是redis只存熱數據,大部分數據放到mysql里。具體選哪種還是要 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...