2016-12-28 63 views
1

我有一個PHP腳本,需要執行回調函數並捕獲特定類型的錯誤。PHP:防止嵌套try-catch捕獲特定錯誤

<?php 

class MyException extends Exception{} 

function doStuff(callable $callback){ 

    try{ 
     $callback(); 
    } 
    catch(MyException $e){ 
     #Deal with it 
    } 
} 

?> 

回調函數可以使用try-catch來防止我的異常被冒出來。我如何允許回調函數實現try-catch塊但不允許它捕捉MyException?

+0

我不認爲你可以。 – Barmar

+0

用例?我沒有看到不允許回調處理他們自己的異常的原因,這個回調本來就是拋出異常的原因。 – Devon

+0

@Devon我懷疑用例是回調使用他的庫,並且庫引發異常。 – Barmar

回答

0

原諒我,如果我讀過這個問題錯了 - 我不認爲這個地方需要用例的 - 但我認爲這樣的事情會工作:

<?php 

class MyException extends Exception {} 

/* 
* This method is in the library. It's not in your control 
*/ 
function doStuff(callable $callback) { 
    try { 
     $callback(); 
    } catch(Exception $e) { 
     die($e->getMessage()); 
    } 
} 

/* 
* We want to do something, but not let any MyException pass through to doStuff() 
*/ 
doStuff(function() { 
    try { 
     connect('mysql:dbname=IDoNotExist;host=127.0.0.1', 'batman', 'robin'); 
    } catch(MyException $e) { 
     return; // Do nothing with MyException, continue as if it didn't happen 
    } catch(Exception $e) { 
     throw new Exception($e); // Not an instance of MyException ... let the library handle it 
    } 
}); 

/* 
* This is dummy code that will throw MyException if the username and password are incorrect 
*/ 
function connect($dsn, $username, $password) { 
    try { 
     $dbh = new PDO($dsn, $username, $password); 
    } catch(PDOException $e) { 
     throw new MyException($e->getMessage()); 
    } 
} 

我假設,由閱讀評論和你的迴應,那doStuff()是你通過callable來的一些圖書館電話。如果您的回調中的代碼獲得MyException,您希望完全忽略此操作。

上面的代碼將完全忽略MyException,就好像什麼也沒有發生。儘管我絕不會主張這樣的解決方案。

+0

我確實希望MyException被doStuff()函數中的try-catch拾取。我試圖阻止該回調中的任何代碼捕獲該特定異常,以確保它始終冒泡。基本上我不希望回調覆蓋我的錯誤處理。 – user3800918

+0

從每個人的評論看來,我需要重新思考它的整個運作方式。在回調中設置try-catch可能會更好,並返回true/false來顯示回調是否成功。謝謝大家的幫助。我會更多地考慮它,希望能提出一個更合適的解決方案。 – user3800918