2012-01-09 28 views
3

我承認我並沒有使用Exceptions很多,他們很難在100%的PHP中掌握,這可能部分是因爲PHP沒有最好的錯誤=>異常支持但是我對他們的瞭解並不多。以下面的代碼爲例,它定義了4個不同的Classes,它們除了擴展一個基本的Exception類外什麼都不做。我只是好奇,爲什麼不會只調用一個異常,爲什麼他們有所有這些單獨的類。爲什麼要使用多個PHP異常類

我假設有一個很好的理由?

class OptimizeImageException extends Exception {}; 

class FileNotFoundException extends OptimizeImageException {}; 

class FileNotImageException extends OptimizeImageException {}; 

class ModuleNotFoundException extends OptimizeImageException {}; 
+0

特殊性是我能想到的唯一原因;如果例外有名字,至少也許你可能知道從什麼時候開始顯示。 – 2012-01-09 01:42:36

+0

@Jared Farrish:「當它開始出現時」 - 你有異常痕跡,並知道它究竟在哪裏拋出,有或沒有特定類別的每種情況 – zerkms 2012-01-09 01:46:01

+0

@zerkms - 我不確定你是否同意或不同意跟我? – 2012-01-09 01:48:12

回答

5

通過擁有多個Exception類,您可以在捕捉它們時挑選出您感興趣的一個。

<?php                  
class OptimizeImageException extends Exception {}; 

class FileNotFoundException extends OptimizeImageException {}; 

class FileNotImageException extends OptimizeImageException {}; 

class ModuleNotFoundException extends OptimizeImageException {}; 

try { 
    throw new FileNotImageException(); 
} catch (FileNotFoundException $x) { 
    echo "NOT FOUND!"; 
    // do something about it 
} catch (FileNotImageException $x) { 
    echo "NOT IMAGE!"; 
    // do something about it 
} catch (Exception $x) { 
    echo "UNKNOWN EXCEPTION!"; 
    // do something else about it 
} 

這是一個簡單的例子,但是說你有一個功能loadImage()這是應該加載圖像。如果該功能失敗,您可以以不同方式處理不同的故障情況。如果你總是拋出一個基本的Exception,你只知道出了點問題。你不知道什麼地方出了問題,所以你不能根據不同的情況有不同的恢復響應,而不是沒有使用另一種機制(這會使異常變得相當弱)。

2

您需要有不同的異常類才能找出實際上發生的情況下,可以處理某些特定的異常。

像:

try { 
    // do something 
} catch (OptimizeImageException $e) { 
    // image cannot be optimized. left it as is and log the error message 
} 

在上面,你正在處理一個特定的異常情況下的代碼,可以在這裏處理,現在預期將您的應用程序流。其他可能的例外情況會上升。

如果你只有一個異常類,比如MyAppException,那麼你所能做的只是抓住它,檢查消息(這很奇怪),以便了解實際發生的事情,以及是否無法處理它 - 重新拋出異常。正如你可以看到的那樣,你的代碼會有點駭人,而且不可維護(你不能修改異常信息)

相關問題