2011-04-06 92 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