php防錯處理,更好的PHP錯誤處理

=====錯誤類型====

PHP 主要有兩種錯誤:觸發錯誤和異常。

其中觸發錯誤大概可以分為:編譯錯誤、引擎錯誤和運行時錯誤,其中前兩個是無法捕獲的;

異常都是可以捕獲的,當沒有嘗試捕獲時則會中斷代碼。

觸發錯誤可以通過 error_get_last() 來進行獲得,異常可以使用標準的 try...catch 語句來捕獲。

=====處理方式=====

【錯誤報告】

error_reporting() 函數是 PHP 提供的一個控制錯誤等級的函數,如果設置了對應的錯誤等級,則只會在對應錯誤等級觸發時才會在頁面(或輸出,對于命令行來說)輸出響應的錯誤信息。

error_reporting(int level) 支持等級 level 參數使用二進制的數字來配置錯誤等級,錯誤等級一般用常量來代替對應的二進制標識。例如:E_ALL、E_NOTICE、 E_USER_NOTICE 等等;如果不傳遞參數,則會返回當前的錯誤等級(一般用來保存當前的錯誤等級以供后續恢復)。

其中 E_PARSE、E_COMPILE_* 和 E_CORE_* 是非運行時錯誤,無法被捕獲的

【php.ini】

配置文件是 PHP 初始化的默認配置,通過修改某些參數可以控制對應的初始化參數。如果要控制錯誤,可以通過以下幾個方式來配置:

display_errors - 是否顯示錯誤,一般在生產環境建議關閉該參數并和下列的參數一起試用 log_errors - 記錄錯誤開關,如果打開會記錄到對應位置 error_log - 記錄錯誤日志的位置,不指定為系統默認 error_reporting - 同上面的函數

【錯誤抑制】

PHP 提供了一種特殊的操作,通過在語句前面加上抑制錯誤操作符@來抑制該語句出現錯誤。這種情況通常用于你不知道會發生什么情況下使用,比如打開了不確定的文件或者網絡 URL,但一般不推薦使用

抑制錯誤本身內部做了一系列的處理才達到該效果,并且對于錯誤本身完全是未知的,一般情況下,不建議這么使用

【捕獲異常】

幾乎在所有語言中,都會有對于異常的處理。如果程序拋出一個異常,那么可以通過 try…catch 語句來捕獲該異常,如果明確知道錯誤的類型,也可以只捕獲該類型的錯誤。try…catch 是一種最標準的錯誤處理方式。

try {

// 代碼部分

} catch (Exception $e) {

// 根據異常對象對 $e 進行處理

}

【設置錯誤處理器】

PHP 提供了 set_error_handler() 函數來讓開發者傳入一個函數名(或匿名函數,對于 5.2 以上的 PHP)就可以讓所有的錯誤進入該函數,然后開發者可以在函數內進行控制,舉例說明

set_error_handler(function($code, $msg){

log_error("$msg occur with code $code");

});

對應地,PHP 也提供了 restore_error_handler() 來恢復為標準的 PHP 錯誤控制。

【設置異常處理器】

如果每個異常都去捕獲,顯然是很復雜的事情,需要編寫很多代碼,而且維護起來會比較復雜,對于一個快速編程的語言來說,PHP 自然不會允許發生這種事情。使用 set_exception_handler() 就可以像上面錯誤處理控制器一樣接收所有未捕獲的異常,然后做一些該做的事情,甚至還可以再把錯誤拋出來。例如:

set_exception_handler(function($exception){

log_error("Exception occur: $exception");

});

【崩潰捕獲】

該類處理并非 PHP 標準的處理方式,但對于某種使程序崩潰的無法捕獲的錯誤確實很有用,它是指注冊一個 shutdown 函數,在函數內通過調用 error_get_last() 來獲取最后的錯誤,并且根據錯誤等級來做相應的處理。

register_shutdown_function(function(){

$error = error_get_last();

if ($error && $error['code']()() & error_reporting()) {

// 崩潰錯誤,記錄日志

}

});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457098.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457098.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457098.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Windows安裝Apache注冊服務出現(OS 5)拒絕訪問。 : AH00369: Failed to open the Windows service manager,

windows安裝Apache,注冊服務出現“(OS 5)拒絕訪問。 : AH00369: Failed to open the WinNT service manager..."錯誤 在安裝Apache的時候,我下載的是zip格式,不是msi安裝版,需要自己注冊服務,才能在桌面任務欄里有…

算法與數據結構(三) 二叉樹的遍歷及其線索化(Swift版)

前面兩篇博客介紹了線性表的順序存儲與鏈式存儲以及對應的操作,并且還聊了棧與隊列的相關內容。本篇博客我們就繼續聊數據結構的相關東西,并且所涉及的相關Demo依然使用面向對象語言Swift來表示。本篇博客我們就來介紹樹結構的一種:二叉樹。在…

關于android開發時,發生Error infalting classa com.baidu.mapapi.map.MapView的解決辦法

1.問題描述:百度地圖SDK中 Error: infalting classa com.baidu.mapapi.map.MapView 。 2.解決辦法:通過1個多小時的上網搜索,最終發現很多網友之所以出現這方面的問題有以下幾種原因: (1).忘…

c++動態綁定的技術實現

1 什么是動態綁定 有一個基類,兩個派生類,基類有一個virtual函數,兩個派生類都覆蓋了這個虛函數。現在有一個基類的指針或者引用,當該基類指針或者引用指向不同的派生類對象時,調用該虛函數,那么最終調用的…

linux替換某個文件夾下所有文件,Linux 批量查找并替換文件夾下所有文件的內容...

1.批量查找某個目下文件的包含的內容cd etcgrep -rn "查找的內容" ./2.批量替換某個目下所有包含的文件的內容cd etcsed -i "s/查找的內容/替換后的內容/g" grep -rl "查找的內容" ./3.批量查找并替換任意文件夾下的文件內容。sed -i "s/要…

Day09-遞歸

#模擬棧結構 stack [] #壓棧(想棧里存數據) stack.append("A") print(stack) stack.append("B") print(stack) stack.append("C") print(stack)#出棧(在棧里取數據) res stack.pop() print("…

java中String相等問題

判斷兩個字符串是否相等的問題。在編程中,通常比較兩個字符串是否相同的表達式是“”,但在java中不能這么寫。在java中,用的是equals(); 例:A字符串和B和字符串比較: if(A.equals(B)){ } 返回true 或false. String 的equals 方法用于比較兩個…

linux proc文件 write的原子性,linux - Linux中writev()系統調用的原子性 - 堆棧內存溢出...

在fs.h找到它:static inline void file_start_write(struct file *file){if (!S_ISREG(file_inode(file)->i_mode))return;__sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, true);}然后在super.c:/** This is an internal function, p…

關于對發送HTTP請求以及解析服務器返回的數據操作的提取到一個公共類中進行封裝

創建一個名為HttpUtil的類并提供名為sendHttpRequest靜態方法.相關代碼如下: package com.hzy.networktest;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;p…

初始化CSS

不同的瀏覽器默認樣式不一樣,所以容易出現兼容性問題,每次寫網頁時都應該都網頁的css或HTML標簽進行初始化 這樣可以節約代碼,節約網頁下載時間,是網頁內容更加簡潔, 大致需要初始化的地方有 H1-H4標簽,table標簽,文字大小,文字沒有鏈接,超鏈接樣式,DIV,居中,ol,ul,li,img等等的…

Day10-時間

UTC(世界協調時間):格林尼織天文時間 在中國來說是UTC8 DST(夏令時):是一種節約能源而人為規定時間制度,在夏季調快一個小時時間的表示形式: 1、時間戳 以整形或浮點型表示時間的一個以秒為單位的時間間隔 …

WebForm 分頁與組合查詢

1.封裝實體類 2.寫查詢方法 //SubjectData類 public List<Subject> Select(string name){List<Subject> list new List<Subject>();cmd.CommandText "select *from Subject where SubjectName like a ";cmd.Parameters.Clear();cmd.Parameters.A…

linux如何輸出當前時間,如何在linux下輸出當前時間

用localtime可直接分解出年月日時分秒QUOTE:struct tm *ptm;long ts;int y,m,d,h,n,s;ts time(NULL);ptm localtime(&ts);y ptm->tm_year1900; //年m ptm->tm_mon1; //月d ptm->tm_mday; //日h ptm->tm_hour; //時n ptm->tm_min; //分s ptm->tm_…

node.js簡單爬蟲

這里假設你已經安裝好node.js和npm&#xff0c;如果沒有安裝&#xff0c;請參閱其他教程安裝。 配置首先是來配置package.json文件&#xff0c;這里使用express,request和cheerio。package.json如下&#xff1a; {"name": "node-scrape","version&quo…

Day11-遞歸性能測試

import time time.clock() sum 0 for i in range (1000000000):sumi print(time.clock()) 慎用 慎用 慎用

關于在新建的package中用SetContentView()函數時無法找到已創建的R.layout的布局文件的的問題的解決辦法

問題描述如下&#xff1a; 解決途徑&#xff1a;是在導入包的過程中&#xff0c;錯誤的將系統自動將Android.R這個包導入最終導致用setContenView()加載布局時只能顯示系統自帶的布局&#xff0c;無法顯示自己已經創建的布局。只需將相應活動中導入的Android.R包刪除&#xff0…

Struts2入門(二)——配置攔截器

一、前言 之前便了解過&#xff0c;Struts 2的核心控制器是一個Filter過濾器&#xff0c;負責攔截所有的用戶請求&#xff0c;當用戶請求發送過來時&#xff0c;會去檢測struts.xml是否存在這個action&#xff0c;如果存在&#xff0c;服務器便會自動幫我們跳轉到指定的處理類中…

linux固態機械分區嗎,不再疑惑!實測數據后才知道固態硬盤究竟要不要分區

不再疑惑&#xff01;實測數據后才知道固態硬盤究竟要不要分區2019-12-10 20:52:00162點贊594收藏177評論前幾年的固態硬盤價格昂貴&#xff0c;一般用戶會選擇128G或256G的固態作為系統盤&#xff0c;由于單盤空間不大&#xff0c;一般都會配合機械硬盤使用&#xff0c;無需考…

關于無法加載已創建的布局文件的問題的解決方案以及已布局在對應的R文件中未生成相應ID的問題的解決

先來說下創建后的Layout布局文件在對應的R文件中不能生成相應的ID問題&#xff0c;一般情況下之所以出現這種問題是應為自己的res文件中有錯誤的文件&#xff1a;對應的是錯誤的文件格式名稱&#xff0c;以及錯誤的文件內容等。博主就遇到過為drawable文件起了一個非法的名稱&a…