2011-04-06 36 views
0

我一直在PHP中看到這樣的代碼,我不知道這是什麼。什麼是PHP中的「catch block」?

$pdo = new PDO ($connect_string, $user, $pass); 
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
try { 
    $pdo->exec ("QUERY WITH SYNTAX ERROR"); 
} 
catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

我感興趣的是catch (PDOException $e)一般的代碼。 我var_dump異常,它返回PDOException類(doh ..邏輯)。但是,這並不清楚這個技術背後的想法是什麼,爲什麼它被使用,它的名字是什麼:)

我在Java編程中也見過這種技術,但不幸的是我不太瞭解Java ...... :/

+0

PDO是這方面的配置。如果設置爲'$ pdo-> setAttribute(PDO :: ATTR_ERRMODE,PDO :: ERRMODE_WARNING);',您也可以讓它拋出oldschool PHP錯誤消息。只是對於業務關鍵型數據而言,異常和try/catch是首選,而警告更多地用於過渡舊代碼庫。 (雖然它仍然是完美可行的,但爲了簡單起見。) – mario 2011-04-06 00:41:27

回答

3

這是一個異常處理程序,用於處理由$pdo->exec()引發的異常。

當您執行$pdo->exec(),有可能的例外(代碼不被用作期望的)可能發生的,他們是拋出(與throw new PDOException('error!')或similiar)。它們將被拋到其特定類型的第一個捕獲點。

在上面的示例中,您的catch() { ... }塊將會記錄PDOException的例外情況。如果你沒有這個塊,它會冒泡到任何進一步的異常處理程序,如果不處理,將會導致應用程序崩潰。您會看到一些應用程序的try{ ... }/catch(){ ... }塊封裝了它們的主要請求,因此未處理的異常將一直向上冒泡(並被處理)。

如果你需要有被抓清理代碼或必須在例外的情況下跑出的任何代碼,您使用finally { ... }(但PHP at this stage does not support it)。

如果要更改異常處理程序的行爲,可以使用set_exception_handler()

+0

好吧,清除一些東西。我已經在其他代碼中看到過這樣的一個'抽象類phpDataMapper_Adapter_PDO {public function read(phpDataMapper_Query $ query)}'。任何想法都是關於什麼的? – tftd 2011-04-06 00:21:33

+0

有點不同意你的觀點,除非例外不被認爲是*非致命錯誤*。它們是例外情況,應在特殊情況發生時提出。例外**可能致命**,即使被發現。 – netcoder 2011-04-06 00:22:34

+0

@netcoder好的,我同意,我試圖做一個比喻,但失敗了。我修改了它,你覺得現在有什麼意義嗎? :) – alex 2011-04-06 00:23:31

1

這是一個錯誤處理機制。如果出現錯誤,則會引發異常(在這種情況下,該異常的類稱爲PDOException),並且在代碼的catch部分中處理錯誤消息並可能清除try塊中可能發生的混亂。

1

你definetly應該瞭解一些OOP :)

這是管理失誤的面向對象的方法:在PHP(如Java中)意外情況(如錯誤)的對象,正是因爲別的。 當一個方法(將其命名爲methodA())調用會導致一些意外的情況,而不是返回false或僅僅終止程序時引發「異常」。這意味着該方法被中斷,程序流被傳遞給調用「methodA()」方法的方法/函數,該方法有兩個選項:自行處理異常或管理它。當你編寫一些可能會導致意外行爲的代碼時,你可以用一個「try-catch」塊來包圍這段代碼,就像上面的例子:如果方法調用拋出一個異常對象( catch子句中的類型),所有「try」塊中剩餘的代碼將被跳過,並且「catch」塊中的代碼將被執行。剩下的代碼將會正常執行。

如果你沒有發現異常,你可以運行不同的行爲:在PHP中它取決於你的php.ini文件,在JAVA中它導致程序結束,在jsp中異常顯示在屏幕上等等上。實際上,在生產應用程序中,除非你絕對不會拋出異常,否則它們總是會拋出異常。

只是作爲一個起點,看看這個:http://php.net/manual/en/language.exceptions.php

+0

謝謝,對不起英語=) – ArtoAle 2011-04-06 00:30:17