2012-04-13 18 views
0

我讀documentation for cfthrow來到翻過這cfthrow是你如何使用它? (來自Adobe的文檔)

當使用cfthrow標籤

使用cfthrow標籤時,你的應用程序可以識別和處理 應用程序特定的錯誤。 cfthrow標籤的一個典型用途是在 中實現自定義數據驗證。 cfthrow標籤也可用於將自定義標籤頁中的錯誤引發到調用頁面 。

例如,用來設置一個 口令表單操作頁面或自定義標記上,應用程序可確定該密碼是否輸入 是最小長度,或既包含字母和數字,並且拋出 誤差與指示已損壞的密碼規則的消息。 cfcatch塊處理錯誤並告訴用戶如何糾正 問題。

我是否一直在做這個錯誤,或者這只是一個可怕的用例?

我被教導不應該使用異常來處理常規的應用程序流,但是對於那些有點超出你控制範圍的東西。例如,當您寫入文件時,文件被鎖定。

打破密碼規則的用戶聽起來不像是你無法控制的東西。

+0

做任何這些回答你的問題? – baynezy 2012-04-14 05:45:45

+0

@baynezy是的,我總是接受一個答案。在這種情況下,我真的很難選擇,所以我花了一段時間對不起:) – jfrobishow 2012-04-15 13:41:59

+0

哦,我沒有追逐。我只是想知道你是否需要更多。 – baynezy 2012-04-15 14:18:19

回答

5

這是一個不好的例子,不是一個糟糕的用例。我個人會將這些參數傳遞給一個驗證函數,並返回一個包含通過或失敗的結果以及一系列失敗消息以顯示給用戶。

我如何使用例外情況如下。

內部功能。假設您有一個函數可以從數據庫中獲取一些數據,然後從中構建一個結構。如果返回的查詢有沒有價值,你有幾種選擇: -

  1. 你可以返回一個空的結構,讓調用代碼從事實結構是空的推斷問題。這並不理想,因爲應用程序必須具有複雜的邏輯來解決缺失的數據。

  2. 您可以返回一個更復雜的數據類型,其中一個屬性是進程是否正常以及實際數據。再次,這不是最佳的,因爲您必須在大部分時間有數據並且您的應用程序正在處理此問題時,才能在每次調用時訪問該屬性。

  3. 或者你可以用cfthrow引發一個自定義異常,指出沒有匹配的記錄。這意味着你可以選擇忽略發生這種錯誤的前景,並讓它冒泡到onError處理程序,或者你可以將它包含在try catch語句中,然後在那裏處理它。這可以讓你的API清潔明智。

結束語外部錯誤讓我們說,你連接到使用CFHTTP通過https外部API。現在,這需要將證書安裝在密鑰庫中,否則會引發錯誤。如果這個證書得到更新,那麼它將再次開始錯誤。在這個例子中,我將這個調用封裝在一個try catch中,並且應該是這個錯誤,我會用自己的自定義異常封裝這個錯誤消息,詳細說明我們需要更新keystore中的cert,以便調試它的任何開發人員知道該怎麼做無需解決就可以修復它。如果它不是那個特定的錯誤,那麼我會對它進行cfrethrow以使它起泡,並且由任何異常處理邏輯超出調用來處理。

這些只是一些例子,但還有更多。總結一下,我會說拋出異常是一種通過應用程序層進行溝通的方式,當發生的事情不是希望行爲的時候,同時保持您的API /應用程序邏輯清晰易懂。

1

這完全取決於您的判斷。在許多語言中使用異常都是非常常見的,包括輸入驗證。

重要的是,異常與您控制或不控制的東西無關。例如,假設您有一個上傳文件的相當長且複雜的模塊。在這樣的事情中有很多失敗點:文件可能太大,文件可能是錯誤的格式等等。沒有例外,你唯一的選擇是很多if/then檢查和某種狀態返回到最後。有例外,所有你需要做的就是使用一組cfthrows的:

<cfthrow type="FileUpload.TooBig" message="The file size was #FileSize#, but the maximum size allowed is #MaxFileSize#"> 

<cfthrow type="FileUpload.WrongType" message="The file type was #FilType#, but the accepted types are #AcceptedTypeList#"> 

之後,無論是在調用文件上傳功能可以捕捉或者與<cfcatch type="FileUpload">或趕上一個特定(例如<cfcatch type="FileUpload.WrongType">)。

此外,從用戶確定密碼的值的意義上講,技術上來說,打破密碼的用戶是不受控制。也就是說,我討厭密碼規則,因爲它們總是會讓維護安全性變得更加困難而不是簡單。

+0

雖然在資源使用方面不算相當昂貴嗎?它包含的不僅僅是「消息」部分。我學習了.NET的異常處理,當拋出異常時,你當然可以「感覺」它。我通常在被「其他人」調用的組件中使用異常。我期望他們將它封裝在try/catch中,但如果可能的話避免觸發異常的條件。因此,以密碼爲例,我會投入CFC,但完全期望調用者在之前驗證過他們的東西。這個投擲是作爲保護他們的最後一道防線。 – jfrobishow 2012-04-13 14:00:16

+0

一個更好的例子是在不存在的目錄中創建一個文件。您可以簡單地捕獲錯誤創建目錄,然後重試...但是,在嘗試寫入DirectoryExists(路徑)之前,您是否更好地節省了開銷並檢查了它們? – jfrobishow 2012-04-13 14:04:35

+4

@jfrobishow我不認爲它是*如此*資源昂貴,它超過了更多可讀代碼的好處。考慮到我們在這裏正在討論一個Web應用程序,像優化查詢這樣的事情會在性能下降方面比避免異常做得更大。在Python中,異常幾乎總是被認爲是最佳實踐而不是測試。其邏輯是:如果發生異常的可能性不大,那麼大多數情況下不先做測試會更快,並且假設它會起作用,然後處理罕見的情況是有問題的。 – 2012-04-13 14:49:26

相關問題