国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - PHP教程 - php中的異常和錯誤淺析

php中的異常和錯誤淺析

2021-05-14 17:16daisy PHP教程

PHP錯誤是屬于php程序自身的問題,一般是由非法的語法,環境問題導致的,使得編譯器無法通過檢查甚至無法運行的情況。PHP異常一般是業務邏輯上出現的不合預期、與正常流程不同的狀況,不是語法錯誤。本文介紹了php中異常和

本文主要介紹了php中的異常和錯誤,分享給大家供大家參考學習,下面來一起看看詳細的介紹:

一、異常與錯誤

異常是指程序運行中不符合預期情況以及與正常流程不同的狀況。錯誤則屬于自身問題,是一種非法語法或者環境問題導致的、讓編譯器無法通過檢查設置無法運行的情況。

由于php最開始是沒有異常處理,后來為了進軍企業級開發,模仿java等語言,推出了異常。導致php中遇到任何自身錯誤都會觸發一個錯誤,而不是拋出一個異常(某些情況下,會同時拋出錯誤和異常)。PHP一旦遇到非正常代碼,大多數情況下,都是直接拋出錯誤,而不是異常。

php只有在你throw 一個異常后,才能用try...catch來捕獲異常(一般情況下如此,也有部分異常可以自動捕獲)。

在php中通常會在以下場景中使用異常:

     1. 對程序的悲觀預測:如果認為自己的代碼無法一一處理各種可預見的情況、不可預見的情況。

     2.  程序的需要和對業務的關注 : 如果對數據的一致性要求很高時,可以用try...catch把異常造成的邏輯中斷破壞將到最小,并且經過補救處理后,不影響業務邏輯的完整性。

     3. 語言級別的健壯性要求 : 通過精確控制運行時的流程,在程序中斷時,有預見的用try...catch縮小可能出錯的范圍,及時捕獲異常并做出相應的補救。

二、怎樣看待php的異常

歷史原因導致php的異常處理是不足的,絕大多數情況下,無法自動拋出異常,必須使用if...else先進行判斷,再手動拋出異常。

手動拋出異常的意義不是很大,因為這意味著在代碼里已經充分的預期到錯誤的出現。同時這種方式還會讓你在復雜的邏輯判斷和處理中暈頭轉向。導致失去異常真正的優點。

那么有更好的異常拋出方法嗎?有,那就是結合使用錯誤

三、php中的錯誤

錯誤就是會使腳本運行不正常的情況。

在php中主要的錯誤等級如下:

      1. deprecated: 最低級別的錯誤,表示"不推薦, 不建議"。例如在php 5中使用了ereg系列的正則函數就會出現。這類錯誤一般由于使用了不推薦的、過時的函數或語法造成。不影響程序正常運行,但建議修正。

      2. notice: 一般指語法中存在不恰當的地方。如使用變量但是未定義就會報此錯誤。不影響程序正常流程。

      3. warning: 較高級別的錯誤,在語法中出現很不恰當的情況才會出現此錯誤,比如函數參數不匹配。會導致得不到預期的結果,需要修改代碼。

      4. fetal error: 致命錯誤,直接導致程序終止運行。這類錯誤必須修改。

      5. prase error: 語法解析錯誤,上面幾種都屬于運行時錯誤,此錯誤在運行前就會拋出。

在php中,總共有16錯誤級別,但是主要的就是上面幾種。

error.php

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$data = '2012-12-20';
if (ereg("([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})", $data, $regs)) {
 echo "$reg[3].$regs[2].$regs[1]";
} else {
 echo "Invalid data format: $data";
}
 
$a = array('o' => 2, 4, 6, 8);
echo $a[o];
$result = array_sum($a, 3);
echo func();
 
echo '致命錯誤后,還會執行嗎?';
//echo '最高級別錯誤', $55;

上面代碼執行后,會有四個錯誤級別,如果你無法完全看到的話,你需要去修改你的ini配置文件中錯誤顯示級別為 E_ALL

四、自定義錯誤處理程序

可以使用 set_error_handler() 函數來托管錯誤處理程序,可自行定制錯誤的處理流程。

如果要取消托管的話,可以在同一個頁面中使用restore_error_handler()來取消托管。

如果想要自己拋出一個錯誤的話,可以使用trigger_error()函數。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
//自定義錯誤處理程序
function customError($errno, $errstr, $errfile, $errline)
{
 echo "<b>錯誤代碼:</b>[{$errno}] {$errstr}", PHP_EOL;
 echo "錯誤所在代碼行:{$errline} 文件{$errfile}", PHP_EOL;
 echo "PHP版本", PHP_VERSION, "(", PHP_OS, ")", PHP_EOL;
}
 
set_error_handler("customError", E_ALL | E_STRICT);
 
$a = array('o' => 2, 4, 6, 8);
 
echo $a[o];

執行上面的代碼,可以看到錯誤信息是由我們自定義的處理程序輸出的,完全繞開了系統的處理程序。

如果錯誤發生在自定義處理程序前,則不會調用我們自定義的錯誤處理程序,所以應當先定義錯誤處理程序。

當然不是所有的錯誤級別都可以用set_error_handler來托管,如EERROR、EPARSE、ECODEWARNING、ECOMPILEERROR、ECOMPILEWARNING以及E_STRICT中的部分。這些錯誤信息會以原始的方式來顯示或者不現實。

PHP把許多異??醋魇清e誤,所以這些"異常"同樣可以使用set_error_handler來接管:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
function customError($errno, $errstr, $errfile, $errline)
{
 //自定義錯誤處理是,手動拋出異常
 throw new Exception($errstr);
}
 
set_error_handler('customError', E_ALL | E_STRICT);
 
try {
 $a = 5/0;
} catch (Exception $e) {
 echo '錯誤信息:', $e->getMessage();
}

當然這種處理方式也有自己的優缺點:

       缺點: 必須依靠程序員自己來掌控對異常的處理,對于異常的高發區、敏感區,如果程序員處理不好,就會導致業務數據不一致的問題。

       優點: 可以獲得程序運行時的上下文信息,以進行針對性的補救。

fetal error這樣的錯誤無法捕獲,也無法在發生后恢復流程處理,但是可以使用register_shutdown_function()函數在程序終止或die時觸發一個函數,給程序帶來一個短暫的回光返照。在php4時,不支持析構函數,也常用于模擬實現析構函數。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Shutdown
{
 public function stop()
 {
 if (error_get_laster()) {
 print_r(error_get_laster());
 }
 
 die('Stop.');
 }
}
 
register_shutdown_function(array(new Shutdown(), 'stop'));
 
$a = new a(); //致命錯誤,導致失敗
echo '必須終止';

Parse error級別的錯誤,除了修改ini文件,將錯誤信息寫到日志中,什么也做不了。

小結

php中錯誤和異常是兩個不同的概念,這種設計根本上導致了php的異常和錯誤與其它語言相異。java中,異常時錯誤唯一的報告方式。說到底,兩者的區別就是對異常的認識不同產生的。php異常絕大部分是通過某種方式手動拋出,才能捕獲到。是一種半自動化的異常處理機制。

無論是錯誤還是異常,都可以使用handler接管系統已有的處理機制。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:http://ghost.icosplay.cc/2017/04/25/qian-xi-phpzhong-de-yi-chang-yu-cuo-wu/

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 久草最新 | 97理论片 | 日韩av电影在线观看 | 寡妇少妇高潮免费看蜜臀a 午夜免费电影 | 国产精品免费视频观看 | 久久久久综合精品福利啪啪 | 久久中文字幕一区二区三区 | 一区二区精品视频 | 亚洲视频在线看 | 成人欧美一区二区三区在线观看 | 亚洲欧美国产精品专区久久 | 日韩精品视频在线 | 精品一区二区三区四区五区 | 国产精品自拍视频网站 | 亚洲精品欧美 | 国产高清精品在线 | 欧美3区| 久久久久久久国产精品 | 在线干 | 国产永久免费在线观看 | 久久久网站 | 国产精品成人av | 午夜av电影 | 久久草| 美女一区 | 久久国产精品久久久久久电车 | 性高湖久久久久久久久aaaaa | 黄色在线观看网站 | 日韩 欧美 中文 | 亚洲精品视频区 | 国产精品久久 | 福利视频二区 | 91在线观| 狠狠干天天干 | 天天久久综合网 | 亚洲在线影院 | 欧美一区二区三区久久久久久桃花 | 免费国产wwwwwww网站 | 亚洲人成网站在e线播放 | 综合久久久 | 久久中文字幕一区二区三区 |