2010-04-30 52 views
3

我真的不確定這是否是正確的選擇,因爲異常對我來說真的是一個新鮮的主題。是否有可能捕獲多個異常(讓腳本繼續執行),然後將異常存儲在數組中以便能夠返回所有導致的異常?在數組中存儲PHP異常

通過這麼說,這將是真棒,以便能夠使用異常多隻表明殺死應用程序(腳本)

由於一個錯誤!

回答

11

起初,異常處理不是微不足道,因爲它的樣子,所以你應該在這個投資一點時間。 :-)

您應該將異常顯式看作是在當前代碼/函數中無法處理的錯誤。如果你能解決問題,就沒有必要拋出和處理異常。
不要將其用作處理預期行爲的機制。

當然有可能趕上多個異常,繼續執行代碼,並將其存儲在一個數組,但它沒有任何意義。如果你真的遇到你在當前代碼中無法處理的錯誤(例如突然關閉的套接字等),那麼通過代碼中的異常。然後,規則是:
只捕獲異常,如果你可以做一些有用的東西與它或拋出另一個異常

對於跟蹤誤差在你的應用程序,你應該使用其他技術不是將它們存儲在一個數組,後來檢索它們。使用日誌記錄(有很好的框架,例如Log4PHP)記錄次要應用程序錯誤和警告。

通過這麼說,這將是真棒,以 能夠使用異常超過 只是表明殺死 應用程序(腳本)

異常應只殺應用程序中的錯誤在這種情況下你無能爲力。在大多數情況下,最好在腳本的最高級別捕獲所有異常,使用堆棧跟蹤記錄錯誤並向用戶提供一個很好的錯誤消息,而不是僅僅「殺死」所有內容。 :-)

有關某些語法示例,請參閱W3Schools PHP Exception Handling。 關於此主題的較大文章發佈在Devshed上。

+0

嗨Echox!感謝您的廣泛答覆。你有任何關於如何使用Log4PHP到數組的例子嗎? 謝謝! – Industrial 2010-04-30 13:49:03

+0

爲什麼要將所有內容存儲在數組中? :-)只需將其記錄到您的文件系統或數據庫表中? 但是,如果你真的需要將你的「日誌」存儲到數組中,只需使用$ e-> getMessage();並將結果字符串存儲在一個數組中。請參閱W3Schools示例中的多個異常和反思異常。 – echox 2010-04-30 14:46:22

+0

再次嗨!我試圖收集從鏈式操作創建的一些錯誤/狀態消息,並將結果與​​功能一起發回給用戶(true/false) – Industrial 2010-04-30 14:58:26

6

這不是真正的例外。在很多語言中,異常只是您可以捕獲的對象,並且只是插入一個數組中供以後檢查,但它確實是一個糟糕的設計。

該機制的名稱表明發生了某種「例外」,您需要立即進行處理。

2

可不僅僅是查殺腳本與他們做更多的 - 但是聖哈辛托是正確的說,它不會將它們存儲在一個數組後處理特別好做法。

也許你應該有這樣一個讀(包括例子,他們會很有用):

http://php.net/manual/en/language.exceptions.php

這應該告訴你,你可以使用異常其他一些方法,而不只是停止執行。

祝你好運!

1

拉里沃爾在他最後一篇關於洋蔥篇的文章中寫到這件事。每個人都希望能夠有一個錯誤投擲/捕捉框架。事實是,僅僅依靠框架來處理一個經過嚴格檢查的代碼就變成了糟糕的編碼習慣。另外,它使調試非常困難。

我的建議是,而不是像這樣:

try { 
    $fh = fopen("foo.txt", 'r'); 
    if (!$fh) { 
     throw new Exception("foo.txt not found"); 
    } 
    # ... 
} catch (Exception $e) { 
    # report errors 
} 

只是收集他們的信息的緩衝區,因爲它們發生:

@errors = array(); 
if (! (is_file("foo.txt") && $fh = fopen("foo.txt", 'r'))) { 
    $errors []= "foo.txt not found"; 
} 
# ... 

這樣一來,你的堆棧指針ISN」跳到各地試圖找到一個處理程序的Exception

PHP試圖太像Java,恕我直言。

+4

任何適度複雜的應用程序都會與此方法呈指數級複雜關係,當然除非您指的是那些實際上並不那麼糟糕並且實際上應該是警告的異常。緩存(不是「捕捉」,而是「緩存」))它們很容易;它後來處理它們非常困難。問題的一部分是,當發生異常時,你失去了很多狀態。另一個問題是何時處理這些例外的問題。我個人認爲你的方法會打開一堆蠕蟲。 – 2010-04-30 12:55:56