1 。要捕獲情況2中的所有各種錯誤,是否可以在開發進行的同時完成,或者開發人員必須返回並在項目結束時在每個入口點處添加錯誤捕獲代碼是數百萬行代碼?
這兩者,但通常只是在開發正在進行時才需要。考慮每行代碼可以自行生成哪些類型的錯誤(尤其是從外部或數據庫獲取數據時)是非常重要的,因此您需要考慮每個步驟中的所有錯誤。爲了幫助插入特殊情況處理後一切已經到位,這是一個主人error handling函數發揮作用。只要注意哪些錯誤級別永遠不會觸發您的自定義錯誤處理。您可能還對Exception
class感興趣。同樣,爲了更容易地插入特殊情況處理,只需在更少的點上進行更新,就可以將Exception
類擴展爲您自己的特殊錯誤對象。
2.我的團隊告訴我,他們不知道在案例2中發生錯誤的所有可能情況,直到整個開發完成。但是我認爲無論發生什麼,錯誤的代碼都是一般的。除代碼外,還有一個錯誤捕獲子句,用於捕獲我們想要捕獲的錯誤類別以及錯誤消息,如果不同,可以隨時添加,但底層錯誤代碼相同,因此甚至可以在開發之前寫入錯誤代碼。
種類與#1相同的問題。恕我直言,你是對的。在某些情況下,他們也是如此。一位開發人員真的無法知道另一個開發人員的代碼會產生什麼類型的錯誤,直到他們看到代碼或獲得最終文檔。
3.How做我找出所有可能的或用於捕獲所有可能的情況下,可能會發生的情況下,2,可以有幾百個在任何級別或DB吹起來的東西usecases的讀/寫錯誤,等錯誤我們是否需要單獨的代碼來捕獲每個或一個共同的代碼?
同樣會關閉的問題#1,使用自定義錯誤處理功能或關閉擴展Exception
類(甚至做獨立的類來處理DB嘗試/捕獲VS文件訪問嘗試/捕獲等),這應該顯著幫助。假設您發現數據庫可能吐出的新錯誤。如果已將try和catch塊中的連接和查詢函數包裝在一起,則只需在擴展的Exception
類中添加處理腳本,而不是在DB功能所在的位置添加處理腳本。例如,你可以選擇爲所有的db連接做這樣的事情。 DB_Exception
在這種情況下是你的Exception
擴展版本,它本身可以做自己的任何數量的故障排除任務:
function db_connect() {
$MySQLi = new mysqli(DB_HOST, DB_USERNAME, DB_PW, DB_NAME, DB_PORT, DB_SOCKET);
if ($MySQLi->connect_error) throw new DB_Exception($MySQLi->connect_error);
if ($MySQLi->error) throw new DB_Exception($MySQLi->error);
return $MySQLi;
}
try {$MySQLi = db_connect();}
catch (DB_Exception $e) {if (!$e->is_fixed_now) die($e->special_message);}
你也可以有你的擴展Exception
類引用一組由$code
結構列舉罐頭回應論據。但是,你真的應該而不是嘗試應用特殊的錯誤處理,你可能會得到每一個可能的數據庫錯誤。在大多數情況下,只要獲取MySQL錯誤文本,無論它可能是什麼,並將其轉發給管理員,它的效率和方式都要低得多。
對於您向用戶展示的文字,最好始終保持簡潔和翔實,同時絕對不要遺漏您網站的內部運作。例如:您的數據庫服務器崩潰或有人錯誤地設置了文件權限錯誤:您應該告訴用戶「對不起,技術上的困難,此特定內容不可用,我們的工作人員已收到通知,請稍後再試。 @ so.com或致電555-1212。「您也可以使用基於Exception
$code
參數的罐裝消息,與上面相同,但不會提供任何有助於發生站點攻擊的信息。
此外,「在發生錯誤時系統的後端將發送電子郵件給管理員」並不是一個好主意。用戶可能會一直坐在那裏刷新,直到它神奇地再次開始工作。你可能很容易陷入電子郵件風暴。一種可能的解決方案是運行10分鐘的cron作業檢查以查看錯誤日誌在過去10分鐘內是否已被修改,並通過電子郵件發送新日誌條目摘要。或者,如果您有問題故障單系統,只有在該主題上打開的故障單不存在時才能打開錯誤腳本。
您希望將多少信息返回給用戶?如果發生數據庫讀/寫錯誤,是否希望告訴他們?我認爲大多數情況下都應該使用通用錯誤,然後將錯誤(取決於開發人員的偏好程度)記錄到文件中(如果文件系統出現故障,可能會影響數據庫以及如果它在同一臺服務器上)。計劃任務然後可以定期向負責人發送電子郵件並清除/存檔此文件。 – stealthyninja 2010-12-19 03:47:19
從用戶的角度來看,應該只能看到兩種類型的錯誤:404和503.就這樣。只要你遵循這個規則,所有內在的本質並不重要 – 2010-12-19 03:58:58
對於#1 - 是的。 set_error_handler +異常將允許您捕獲發生的任何錯誤。對於#2 - 爲什麼他們需要知道所有錯誤類型?即使完成,他們也不會知道它。這是無稽之談。舉例來說,一些圖像處理庫在更新之後會變得瘋狂。沒有必要知道所有可能的錯誤。有必要*捕捉所有可能的錯誤。 – 2010-12-19 04:12:41