2010-03-25 35 views
1

爲什麼不使用錯誤數組而不是拋出錯誤,並在代碼後面檢查它是否爲空......異常處理對我來說非常混亂,我無法理解它的目的......任何人都可以啓發我!爲什麼不使用錯誤數組而不是異常處理?

他們用模具進行比較()作爲最好不要停止代碼的執行,我爲什麼要停止執行代碼,如果我不想!? ofcourse我做

我是一個初學編程的,它可能會造成混淆你們了,還是因爲我不是很在這個醜陋的東西有經驗。

請僅在PHP的上下文中。

+0

錯誤處理存在於編程的各個方面,它不是PHP特有的東西。你不想使用die()的一個原因是因爲它終止了腳本。 – Kevin 2010-03-25 00:42:18

+0

你在說什麼? – SLaks 2010-03-25 00:42:31

回答

0

這實際上取決於你在說什麼類型的錯誤。

我總是死();對於真正糟糕的錯誤,就像應用程序無法連接到數據庫一樣。

但對於任何需要用戶輸入,像一個形式,這是更好地使用,而不是在一個時間糾正一個場,並多次不必按提交,用戶可以看到所有在一次錯誤的陣列。 (如果您想更詳細地瞭解,我經常使用一組數組來顯示錯誤,因爲一個字段可能有多個錯誤,例如,如果用戶嘗試使用用戶名註冊一個帳戶「1337」,我將使用驗證器來檢查多個條件,它將返回一個數組,其中包含「用戶名至少5個字符長」,「用戶名至少包含三個字母」,「該用戶名已被禁止管理員」,所有這些信息將同時特定領域上面顯示),你可能決定拋出一個異常,是因爲你可以添加在控制流程跳轉沒有明確的一件語法

+0

是啊,那就是我喜歡處理錯誤的方式......討厭的例外! – 2010-03-25 01:06:44

4

原因之一。我的意思是什麼?

而不是

$returnVal = doSomeDiskFunction(); 
if($returnVal == $ERROR_CODEA) 
{ 
    // do some stuff 
} 
else if($returnVal == $ERROR_CODEB) 
{ 
    //do some stuff 
} 

$returnVal = doSomeOtherDiskFunction(); 
if($returnVal == $ERROR_CODEA) 
{ 
    // do some stuff 
} 
else if($returnVal == $ERROR_CODEB) 
{ 
    //do some stuff 
} 

你可以只是

try{ 
    doSomeDiskFunction(); 
    doSomeOtherDiskFunction(); 
} 
catch(ExceptionTyepA $exceptionA) 
{ 
    //do some stuff 
} 
catch(ExceptionTypeB $exceptionB) 
{ 
    //do some stuff 
} 

似乎會更加清晰,是???如果您選擇在調用堆棧中向上傳播異常,它也是警告調用代碼的一種正式方式,它需要處理潛在的錯誤情況。

此外,異常應該用於代碼,您想到的事情發生,就像沒有連接到數據庫,而不是代碼,您DO料到會發生的,比如說提交壞數據的用戶。另一張海報表明,您期望用戶填寫表單時會犯很多錯誤,所以當您遇到一些用戶輸入格式不正確的數據時,您不會拋出異常,因爲您期望用戶數據質量差。

+0

現在對我來說更清晰了,謝謝 – 2010-03-25 01:10:02

0

有一種方法可以完全編碼而無需異常處理。例如,如果你有一個方法返回一個對象的長度,如果有錯誤,讓它返回-1。這是大多數C API的構建方式。

這就是說,當你建立複雜的系統,你有一噸的「黑盒子」的代碼,可能會錯誤地行爲,異常的幫助。異常工作的方式是這樣的:當某人「拋出」時,調用棧上的人開始得到通知。一步一步來。其中一種方法可以「捕捉」異常並處理它。

爲什麼這很有用:你可以有一個DB層,裏面有大量的邏輯引發異常。如果出現問題,那麼您的數據庫異常處理代碼可能會失敗,並向用戶顯示一條好的錯誤消息;它也可以發送短信給管理員,要求注意。

您甚至可以創建異常處理程序的層次結構:您可以在完成某些操作後重新拋出異常。

+0

是的,但我認爲你所提到的關於它們的所有內容都可以通過其他方式執行(必要時模擬)..對嗎? .. – 2010-03-25 01:14:29

+0

絕對有其他方法可以做到這一點。有沒有例外隱喻的編程語言,並且可以使用不同的原則來處理相同的想法。 – 2010-03-25 06:53:10

0

PHP的例外吸辛苦,但他們仍然有自己的基本利益:「這是怎麼回事」

  1. 異常提供了有關更多的信息在更好的形式(異常是對象)
  2. 它讓你的代碼更清晰
  3. 他們打破代碼部分的執行(因爲它假設到不工作),修復(如果唯一合理的途徑可能)什麼需要修復並繼續而不會完全失敗。
+0

謝謝:)我真的不能放棄,我的聲望很低[8],他們想要15,哈哈。再次感謝。 – 2010-03-25 01:15:51

0

確實取決於語言。 C在這方面是相似的 - 它不會強迫你處理錯誤。如果有問題,大多數函數返回-1;這取決於你檢查'errno'以查看發生了什麼。

雖然異常通常是件好事。如果發生錯誤,您很少想要盲目地繼續運行(絕對不要永遠不要在Visual Basic中說「On Error Resume Next」)。如果你確定你不需要做任何事情,那麼趕上例外並且什麼也不做是很容易的。

+0

我喜歡C的方式 – 2010-03-25 01:17:09

相關問題