成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

我們什么時候應該使用異常?

開發 后端
首先來說, 異常機制是在錯誤碼機制之后才出現的, 那么根據進化論, 異常自然是避免了錯誤碼機制的一些不足. 這些不足包括。

先說個題外話: 在公司做了倆件事, 是我覺得很有意義的, 第一就是成立了一個PHP郵件組, 第二就是成立了一個Hi群. 目前倆者都有超過500 phpers在里面. 我一直認為, 構建一個交流平臺, 讓同學們能順暢, 簡單的溝通, 是營造積極的技術學習氛圍的基礎和前提. 讓每個人的問題不會成為別人的問題, 則是最直接的利益. (后記: 不少人都問郵件組地址, 實在不好意思, 這個郵件組是公司內部的郵件組, Hi也是公司內部的. 謝謝)

昨天, 有同事在郵件組提了個問題:

PHP應該什么時候使用 Exception ? 它的性能如何?

這個問題也算是一個久經爭論的經典問題了. 我談談我的個人看法.

異常與之對應的錯誤碼(或者狀態碼), 到底各自有什么優點, 缺點, 我們應該怎么使用呢?

錯誤碼

首先來說, 異常機制是在錯誤碼機制之后才出現的, 那么根據進化論, 異常自然是避免了錯誤碼機制的一些不足. 這些不足包括.

1. 錯誤信息不豐富

函數, 只能有一個返回值(當然, Lua可以返回多個, 但其實也相當于在PHP中返回一個數組), 我們見過最多的函數說明就是: 成功時候返回***, 錯誤的時候返回FALSE, 然而一個函數出錯我原因可能有多種, 出錯的種類更有多種. 一個簡單的FALSE, 并不能把具體的錯誤信息告訴調用者.

于是, 我們也就見過一些, 這樣的函數說明: 如果返回值大于0, 則表示成功的狀態碼, 如果返回值小于0, 則表示出錯的狀態碼.

然而, 這個要求函數是返回整形(或者數字), 對于一些其他函數, 我們并不能通過0, >0, <0來判別, 并且, 即使通過這樣的方式, 我們還需要用返回的錯誤碼和一些預定義宏(或者調用類似strerror())來獲取具體的, 可讀的錯誤信息.

于是, 就有一些函數使用全局的錯誤碼, 和錯誤信息, 來保存具體的錯誤信息, 這個時候我們就看到這樣的函數描述: 成功返回***, 出錯的時候返回FALSE, 錯誤代碼保存在全局變量$errno中(至少大多數Linux庫函數是這樣描述的, 呵呵).

Okey, 這樣的方式確實可以工作, 但是, 是不是覺得, 很丑陋呢?

2. 加入錯誤狀態碼可能需要改變函數簽名

假設, 你編寫了一個函數, 這個函數很簡單, 很簡單, 你認為他絕對不會出錯, 于是你申明為(用C語言為例, PHP沒有返回類型提示):

  1. void dummy() {  

但是后來你慢慢修改了這個函數, 給了它更多的功能, 此時這個函數可能會失敗了. 而你現在根本無法為這個函數, 加入錯誤返回碼了.

也許有人說PHP沒有返回值類型限制一說, 但是想想PHP的構造函數, 構造函數是沒有返回值的, 當發生錯誤的時候, 如果你不使用異常, 我想你只能選擇die, 或者使用2中的方法來錯誤繼續執行了.

另外, 在一個良好的軟件系統中, 返回類型其實也是約定俗成的, 當所有的使用的函數的地方, 都沒有檢查返回值的時候, 你還是無法為這個函數加入錯誤返回碼.

3. 錯誤狀態碼可能會被忽略

當你的一個函數, 出錯了, 返回了錯誤狀態碼, 而調用方并沒有檢測這個返回值, 會發生什么情況呢? -_#. 令一方面, 處處檢測返回狀態碼, 會造成代碼非常的,,ugly:

  1. <?php  
  2.   if (!call1()) {  
  3.       die();  
  4.   }  
  5.    if (call2() != SUCCESS) {  
  6.      die();  
  7.   }  
  8.    if (call3() < 0) {  
  9.       $msg = error_get_last();  
  10.       die($msg["message"]);  
  11.   } 

異常機制

那么現在我們來看看異常機制, 如果我們采用異常機制, 上面的代碼可以寫作:

  1. <?php  
  2. try {  
  3.    call1();  
  4.    call2();  
  5.    call3();  
  6. } catch (Exception $e) {  
  7.    die($e->getMessage());  

更方便的, 如果你的代碼只是中間層, 你的調用方會負責處理錯誤的話, 你甚至可以簡單的寫作:

  1. <?php  
  2. function myFunc() {  
  3.    call1();  
  4.    call2();  
  5.    call3();  

而一個異常對象, 可以包含更豐富的錯誤信息, 比如錯誤信息, 錯誤碼, 錯誤的行數, 文件, 甚至出錯上下文, 等等, 避免的”1.錯誤信息不豐富”的不足.

我們也可以為一個返回void類型的函數增加異常, 而不改變他的函數簽名, 也就不會有上面說的”2.加入錯誤狀態碼可能需要改變函數簽名”. 對于PHP來說, 如果我們新加入的錯誤沒有被捕捉, 也不用擔心, 會明顯的出錯的. 也就不會發生上面所說的”3. 錯誤狀態碼可能會被忽略”的情況.

然而, 也有一些反對使用異常的聲音:

1. 性能

正如文章開頭提問中的: “它的性能如何?”, 異常機制確實要比返回狀態碼的方式昂貴一些, 對于C++來說, 在異常發生的時候, 還要發生堆棧解退。

性能和方便, 往往是一個矛盾體, 我只能說, 你需要權衡, 如果你寫的是一個小的模塊, 并且它的生命期可能很短, 也不需要什么特殊的設計模式, 那我覺得你可以不用異常.

而如果你在為一個龐大的軟件做開發, 我想你更應該看重的, 應該是, 它的可擴展性, 可維護性.

2. 太多可能的Uncaught Exception

如果, 你調用了一個可能發生異常的函數, 但是卻沒有捕獲這個異常, okey, Fatal Error了, 所以讓我們的代碼看起來:

  1. <?php  
  2. try {  
  3. } catch () {  
  4. }....  
  5.  try {  
  6. } catch () {  
  7. }....  
  8. try {  
  9. } catch () {  

然而, 這個是可以經過良好設計避免的, 比如我在設計Yaf的時候, 就提供了全局異常處理, 也就是類似于, 你在最最頂層, 加上了一個try catch, 所有的異常錯誤邏輯都加到這個里面, 你也可以很方面的把你自己的異常加進去.

結論

經常有人批評我是倆面派, 呵呵, 但是在大家了解了上面的利弊以后, 是否也會和我一樣認為: 這個事情沒有定論呢? 一切從實際出發.

原文鏈接:http://www.laruence.com/2012/02/02/2515.html

責任編輯:張偉 來源: 風雪之隅
相關推薦

2023-03-29 15:01:43

微服務開發

2010-11-09 13:58:03

SQL Server鎖

2015-10-20 15:59:57

注釋代碼程序

2015-10-26 09:38:52

避免注釋代碼

2021-01-30 19:59:37

性能項目開源

2020-06-17 10:35:16

機器學習AI人工智能

2022-09-27 15:06:07

微服務架構開發

2022-05-19 10:27:34

機器學習人工智能

2017-06-28 15:06:51

PythonLambda函數

2024-09-02 08:53:44

2023-04-24 14:32:54

2020-01-05 23:28:51

MQ消息進程

2017-04-05 21:43:08

MQ互聯網架構

2020-05-12 11:25:50

MySQLES數據庫

2017-05-15 09:55:07

2020-04-14 12:53:01

Nuxt.jsVue.js前端

2022-06-27 16:55:30

5G6G

2013-09-29 17:13:59

PowerShell工作流

2015-07-08 15:55:01

NSStringcopystrong

2013-11-28 16:03:24

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 99国产欧美| 瑟瑟免费视频 | 操人网 | 久久乐国产精品 | av免费网站在线 | 色av一区二区 | 黄色大片在线免费观看 | 丝袜美腿一区二区三区 | 精品国产欧美在线 | 久久99久久98精品免观看软件 | 亚洲精品国产一区 | a黄毛片 | 欧美寡妇偷汉性猛交 | 日韩av网址在线观看 | 在线色网址| 日韩精品免费视频 | 一区二区电影网 | 精品国产伦一区二区三区观看方式 | 亚洲国产成人av好男人在线观看 | 成人网av| 亚洲福利在线观看 | 日本久久久久久久久 | 国产精品毛片久久久久久久 | 亚洲每日更新 | 国内av在线 | 欧美在线资源 | 九九热在线免费视频 | 精品亚洲一区二区三区四区五区 | 一区二区三区不卡视频 | 国产精品毛片一区二区三区 | 国产午夜精品理论片a大结局 | 欧美成人一区二区三区片免费 | 69性欧美高清影院 | 国产精品自拍视频网站 | 久久亚洲综合 | 色偷偷888欧美精品久久久 | 精品亚洲一区二区三区 | 久久天天| 亚洲不卡一 | 国产精品福利网 | 99热激情|