錯誤處理之函式返回值OR異常處理

2021-07-11 15:26:06 字數 2977 閱讀 4080

問題:

1、錯誤處理的方法有哪些?

2、使用函式返回值還是丟擲異常?

3、php 原框架下的異常處理機制是怎樣的?

4、php yii框架下的錯誤處理方案是怎樣的?有什麼參考意義?

如上所述四種處理方法,成員變數的方式多數使用在處理結果不用立即返回的情況,譬如對多個資料字段進行校驗返回校驗結果,使用場景比較明確。觸發事件就主要依賴於框架來實現,複雜的處理邏輯可以考慮,使用場景也相對明確。而函式返回值和丟擲異常則用得比較糾結,在編寫**的時候就時常需要考慮什麼時候使用異常處理,什麼時候考慮返回值,而且在巢狀較深的時候還會讓人好好糾結一番。

綜上所述,使用哪種方式來反饋錯誤,的確是要看場景。個人覺得,操作頻率高的**模組盡量少使用異常處理,但是要確保返回資訊的簡潔。而一些失敗因素無法窮舉的場景,如果不會出現效能問題,則考慮使用異常。

使用異常的基本思路是丟擲異常、捕捉異常、處理異常。如下**所示,可以在任何你希望的地方,通過throw語句來丟擲異常物件。

throw

newexception("錯誤描述,描述清楚錯誤原因和可能的解決方案...");

try

catch(exception

$e)

以上是php語言中最基本的異常處理**,exception物件是php內建的異常類,只是簡單得接收異常message,然後展示message。

class

goodsnotfoundexception

extends

exception

}

set_exception_handler('allexception');
exception 的原始碼閱讀:

class

exception //還不知道什麼場景下需要用到

function

__construct

($message = null, $code = 0){} //構造方法

/* 不可過載的方法 */

final

function

getmessage

(){} //返回異常資訊

final

function

getcode

(){} //返回異常**

final

function

getfile

(){} //返回發生異常的檔名

final

function

getline

(){} //返回發生異常的**行號

final

function

gettrace

(){} //backtrace() 陣列

final

function

gettraceasstring

(){} //已格成化成字串的 gettrace() 資訊

/* 可過載的方法 */

function

__tostring

(){} //可輸出的字串

}

上面這段**只為說明內建異常處理類exception的結構,並不是一段有實際意義的可用**,在ide裡檢視php的原始碼基本都是這樣的結構**,內部實現是c**,在src包裡面可以找到。如果使用自定義的類作為異常處理類,則必須是擴充套件內建異常處理類exception,非exception類的子類是不能作為異常處理類使用的。如果在擴充套件內建處理類exception時重新定義建構函式的話,建議同時呼叫parent::construct()來檢查所有的變數是否已被賦值。當物件要輸出字串的時候,可以過載__tostring()並自定義輸出的樣式。可以在自定義的子類中,直接使用內建異常處理exception類中的所有成員屬性,但不能重新改寫從該父類中繼承過來的成員方法,因為該類的大多數公有方法都是final的。

網上摘錄了一段樣例**,供參考!

/* 自定義的乙個異常處理類,但必須是擴充套件內異常處理類的子類 */

class

myexception

extends

exception

public

function

__tostring

() public

function

customfunction

() }

try catch (myexception $e)

echo

'你好呀'; //程式沒有崩潰繼續向下執行

yii框架的異常定義集中在vendor\yiisoft\yii2\base目錄下,但是限於個人能力,還有部分**沒看懂…

uml的類圖結構如下:

1、其中從php原生異常物件中擴充套件 errorexception,用於代表所有虛擬機器級別的異常,可能需要重啟服務才可以重新提供服務。

2、擴充套件unexpectedvalueexception,用於不可知的異常,也就是模糊無法定位具體原因的異常。

3、擴充套件badmethodcallexception,用於呼叫不正確的類、方法、錯誤引數等。

4、擴充套件exception,代表框架內部一些專有的報錯資訊,例如載入配置檔案失敗、架構初始化異常等等。

從yii框架的異常類的定義來看,php語言的內部異常類的確不足夠用於所有的場景,而不同名字的異常又充當了 errorcode的角色,無形中也是帶框架內部加了不少的if分支。

錯誤處理的返回 異常還是返回值

推薦使用異常 因為異常設計就是為了決解 什麼出了錯?在哪齣的錯?為什麼出錯?1.通過使用異常可以明確 錯誤的型別,錯誤的原因,錯誤出現的地方並且呼叫者強制處理,這提高程式的健壯性 robust 而返回值方式需要呼叫者主動去處理。2.使用異常可以使 更加優雅 可讀性提高。不用寫各種if else判斷情...

recv函式和send函式返回值錯誤處理

本文中分析的都是非阻塞態的socket錯誤 因為阻塞態也不會出現ewouldblock錯誤。返回值 0時並且 errno eintr errno ewouldblock errno eagain 的情況下認為連線是正常的,繼續接收。當socket設定為非阻塞的時候,recv返回錯誤時才會有 errn...

函式之返回值

返回值 將函式中運算的結果通過 return defadd a,b result a b print result return hello 100 呼叫函式 x,y add 2,6 print x,y return 返回值 1.return後面可以是乙個引數 接受的時候x add 1,2 2.re...