2010-02-22 26 views
4

使用Adobe ColdFusion版本8及以下版本,我的所有cfqueries都被包裝在調用database.cfc中名爲「CatchError」的函數的try catch中。良好的通用try/catch例程

<cftry> 
    <cfquery datasource="myDatasource"> 
    UPDATE TableName SET 
    ... 
    WHERE ID = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.ID#"> 
    </cfquery> 
    <cfcatch> 
     <cfset local.result = Variables.objDatabase.CatchError(cfcatch)> 
    </cfcatch> 
</cftry> 

Q1:是否有一個已經寫了一個良好的通用錯誤捕手,考慮到各種不同的異常類型(所有,應用程序,數據庫,表達,鎖,MissingInclude,對象,安全性,模板和本地搜索引擎) ?第二季度:我想我也想記錄這些錯誤,也許不是文本文件,而是數據庫。當然,你看到的問題是...在數據庫中記錄數據庫錯誤...

問題3:如果這是本次會話的第一個錯誤,我可能會向某人發送電子郵件。

回答

2

我覺得你的問題適用於在錯誤處理一般,所以你會發現在語言無關的問題,一些有用的答案。

1. Soldarnal回答了問題1,我傾向於同意 - 嘗試抓住每個可能發生錯誤的位置(如數據庫交互),並且更好地擁有一個捕獲所有錯誤的全局錯誤處理程序並在發生錯誤的可能性很高且您希望執行繼續的地方使用try/catch(通常如果您的站點無法訪問數據庫,它會有點卡住)。

2.關於日誌記錄,cflog是最穩健的,因爲除非服務器存在嚴重問題,否則幾乎可以始終登錄文件。 cfmail是下一個 - 服務器應該排隊它不能發送的郵件,儘管還有更多的錯誤。接下來是cfhttp您可以將錯誤記錄到外部網站,但發送錯誤時您需要啓動,否則您將失去它。最後,你可以登錄到數據庫,但如果這是卡住的話。

您可以組合使用,例如將錯誤記錄到數據庫,除非數據庫不可用,然後登錄到文件並在備份時將錯誤重新插入到數據庫中。

3.如果您正在跟蹤錯誤,例如在數據庫中或通過外部服務,您應該能夠配置此功能以向您發送第一個錯誤的電子郵件或cfmail將允許您發送有關所有錯誤的郵件。我們使用自定義的錯誤處理腳本,但可能會在網絡上浮動。

1

在你的Application.cfc,在OnRequestStart功能,您可以加入這一行:

<cferror type="EXCEPTION" exception="any" template="act-error.cfm"> 

通常在ACT-error.cfm要顯示給用戶的HTML表示,他們遇到了一個未處理的異常(用更友好的語言)以及一些友好的鏈接。此外,在行爲錯誤你仍然可以訪問所有的變量,包括錯誤變量做你想做的事(記錄,電子郵件,更新會話變量等)。

顯然,正如您所述,如果原始錯誤是數據庫關閉,則記錄到數據庫將失敗。但是,如果您不知道,ColdFusion管理中會有異常日誌,您可以啓用它來記錄這樣的問題。

編輯 - 下面是一個使用cferror方法一般處理程序: http://www.bennadel.com/blog/932-Ask-Ben-Handling-Errors-With-ColdFusion-CFError.htm

+2

如果您使用application.cfc,您應該使用onError(http://livedocs.adobe.com/coldfusion/8/htmldocs/AppEvents_06.html#1188543),而不是cferror。否則,就像使用螺絲刀敲擊指甲 - 它可能會起作用,但是您錯誤地使用了您的工具。 – 2010-02-23 16:18:06

+1

我很好奇爲什麼OnError更好?我不喜歡使用它,因爲我不喜歡在我的application.cfc中輸出html。 – Soldarnal 2010-02-23 16:57:23

+4

本身並不是「更好」,但它是與application.cfc框架相關聯的錯誤處理機制。考慮它是奧卡姆剃刀的練習 - 最簡單的解釋通常是最好的。如果你聽到蹄子,你會想到「馬」而不是「斑馬」。如果另一個開發人員看到application.cfc,他們會認爲「onError」,而不是「cferror」。 onError方法也具有真正無處不在的優點;在cferror調用之前發生的錯誤將被處理。通過這個,如果你願意,你可以在onError處理程序的主體內輕鬆使用cfinclude。 – 2010-02-23 18:23:47