2010-05-13 128 views
4

讓我們用Exception類的自定義擴展來處理自定義異常, 這樣,例如說:php:在異常處理程序中處理異常?

$testObject = new testClass(); 

和這樣的自動加載:

function __autoload($class_name) { 
    $file = $class_name.'.php'; 
    if (file_exists($file)) { 
     include $file; 
    }else{ 
     throw new loadException("File $file is missing"); 
    } 
    if(!class_exists($class_name,false)){ 
     throw new loadException("Class $class_name missing in $file"); 
    } 
    return true; 
} 

try { 
    $testObject = new testClass(); 
}catch(loadException $e){ 
    exit('<pre>'.$e.'</pre>'); 
} 

文件testClass.php不存在,因此用消息調用loadException: 文件testClass.php丟失。 (和所有其他細節...行號等)

一切都很好,直到我決定隱藏所有的錯誤,而是顯示一個404頁面(或500頁...),所以當然我想添加一個loadErrorPage函數。

class loadException { 

... 

    function loadErrorPage($code){ 
     $page = new pageClass(); 
     echo $page->showPage($code); 
    } 
} 

... 

try { 
    $testObject = new testClass(); 
}catch(loadException $e){ 
    $e->loadErrorPage(500); 
} 

但有明顯的問題是,如果testClass.php和pageClass.php文件丟失,則顯示,而不是首選404頁的致命錯誤。

我很困惑:S 如何在異常句柄中優雅地處理這個異常?

回答

2

如果class pageClass不存在,並且無法通過您的自動加載程序$page = new pageClass();加載您的方法loadErrorPage()會導致另一個異常。你必須抓住這個異常,然後做一些沒有這個類的東西。

function loadErrorPage($code){ 
    try { 
    $page = new pageClass(); 
    echo $page->showPage($code); 
    } 
    catch(Exception $e) { 
    // header(...500); 
    echo 'fatal error: ', $code; 
    } 
} 
+0

不適用於我:S – 2010-05-13 12:22:47

+0

確定創建了一個特定的測試情況下,它確實有效,我想知道爲什麼它在實際應用中不起作用。 – 2010-05-13 12:29:26

0

嗯,你可以永遠只是不能刪除pageClass.php ...

我假定這只是一個文件,應該不會太難,以確保它不會消失,以同樣的方式你要確保其中有你的__autoload函數的文件不會去任何地方。

+0

那麼,這將是簡單的出路:),顯然該文件不會去任何地方。除非一個陌生的網站所有者出現,並且將這個文件從純粹的無聊中刪除! – 2010-05-13 12:19:46

+0

試圖掩蓋每一個可笑的運行時錯誤會讓你一個傷心的編碼器,你知道... – 2010-05-13 12:23:29

+0

:( 這實際上是一個更常見的錯誤 – 2010-05-14 08:37:30