2017-01-22 39 views
0

我有一個(實施例)Oracle存儲過程:PHP PDO輸出用戶定義的例外

CREATE OR REPLACE FUNCTION EXCEPTION_TEST 
    RETURN NUMBER 
AS 
BEGIN 
    raise_application_error(-20500, 'This is the exception text I want to print.'); 
END; 

和我用下面的代碼與PDO調用它在PHP:

$statement = $conn->prepare('SELECT exception_test() FROM dual'); 
$statement->execute(); 

的該函數的調用工作得很好,但現在我只想打印Exception文本。

我在某處讀過,你不應該試着用PDO來抓。我怎樣才能做到這一點?

回答

1

您已經閱讀,您不應該錯過報告它。

但是,如果你想處理它不知何故,它可以抓住它。

基於從我的handling exception in PDO文章的例子,

try { 
    $statement = $conn->prepare('SELECT exception_test() FROM dual'); 
    $statement->execute(); 
} catch (PDOException $e) { 
    if ($e->getCode() == 20500) { 
     echo $e->getmessage(); 
    } else { 
     throw $e; 
    } 
} 

在這裏,你要麼讓你的特定錯誤或重新拋出異常回,使其處理通常的方式

+0

好的,謝謝。我現在就這樣做。但是,僅僅獲取例外文本是不可能的,或者它是不可能的? – Stjubit

+0

我不明白你的問題。你想把這個文本作爲函數的輸出嗎? –

+0

是的。我要輸出的異常文本(「這是異常文本我想打印。」)給用戶,因爲我在做錯誤檢測的SQL存儲過程和函數。 'getMessage'方法打印了很多東西,但我只想獲取例外文本。是否將消息拆分爲僅獲取例外文本是實現此目的的唯一方法? – Stjubit

0

您檢查執行的響應,並得到了錯誤,例如,像這樣:

if ($statement->execute() != true) { 
    echo $statement->errorCode(); 
    echo $statement->errorInfo(); 
} 

你可以找到在PDO manual更多的選擇。

+0

好的,謝謝。這樣可行。現在我得到以下輸出:'致命錯誤:帶有消息'SQLSTATE [HY000]的未捕獲異常'PDOException':一般錯誤:20500 OCIStmtExecute:ORA-20500:這是我想要打印的異常文本。 ORA-06512:位於C:\ xampp \ htdocs \ epcos \ test.php中的第5行(ext \ pdo_oci \ oci_statement.c:148)中的「EPCOS.EXCEPTION_TEST」:9堆棧跟蹤:#0 C:\ xampp \第9行中的C:\ xampp \ htdocs \ epcos \ test.php中拋出的PDOStatement-> execute()#1 {main} 如何才能打印異常文本(這是個例外......)? – Stjubit

+0

好吧,如果你想處理特定的異常,那麼你使用'try/catch'(http://stackoverflow.com/questions/11102644/pdo-exception-questions-how-to-catch-them)。如果你想知道,如果結果是成功的,那麼你使用一個簡單的'if'。 – Peon

+0

所以,你的意思是不可能得到異常文本,我必須檢查異常是否有代碼(-20500)並用PHP打印文本? – Stjubit