2013-02-22 113 views
1

这更多的是一个架构问题。我想知道人们如何正确处理完全面向对象的PHP环境中的错误。正确的错误处理方式

例如,我有一个类从数据库中检索所有用户数据。所以我会以这种方式使用它:

$userData = new UserDataConnection(); 
$userData->openDatabase(); 
$userData->retrieveData(); 
$userData->showData(); 
$userData->closeDatabase(); 

在上述每个步骤中,都可能发生错误。所以我会从每一步返回一个布尔值,说明函数是否已经成功执行(因此错误检查在每个函数中),还是我会在整个事情上做一个try-catch异常处理?或者,还有更好的方法?

当某种错误发生时,总是会遇到某种错误页面会更好吗?

+0

例外情况良好,因为您甚至可以捕捉到无与伦比的异常。但是错误处理主要取决于程序员和他们的风格,而不是一些预设标准。 – 2013-02-22 09:54:41

+0

[处理错误的最佳方法]的可能的重复(http://stackoverflow.com/questions/4227749/best-way-to-handle-errors) – deceze 2013-02-22 09:55:29

+0

确实人们有偏好和风格,但我只是看因为我不是一个PHP程序员。这里的大部分例子都是基于非面向对象的方法,或者使用die()来过早地停止脚本,这看起来非常糟糕和混乱。 – AndyTang 2013-02-22 11:35:54

回答

1
<?php 

$ERROR = false; 
try { 

    $userData = new UserDataConnection(); 
    $userData->openDatabase(); 
    $userData->retrieveData(); 
    $DETAILS = $userData->showData(); 
    $userData->closeDatabase(); 

} catch(Exception $e) { 

    $ERROR = $e->getMessage(); // exit; 

} 

if($ERROR) { 
    $DETAILS = array(); 
} 

?> 

如果您使用的是PDO,则可以抛出PDOException。

+0

$ e-> getMessage()会自动从mySQLi数据库对象中检索错误消息吗?或者我需要把它放在函数调用中吗? – AndyTang 2013-02-22 11:37:34

+0

您必须抛出它或使用PDO并捕获PDOException。 – vectorialpx 2013-02-24 12:56:11

1

它通常归结为一个简单的问题:

愿此功能“合法”失败,或者是任何故障的东西是真的错了的标志?

如果某个函数需要某种输入,并且永远不会使用其他类型的输入调用,则任何提供正确输入的失败都是InvalidArgumentException。对于不直接处理用户输入的函数尤其如此。这种类型的提示可以更好地工作。

如果函数在给定正确的输入的情况下应始终产生特定的结果,则函数产生该结果的任何失败是RuntimeExceptionLogicException或某种其他类型的异常。

如果函数可能产生或不产生某种结果,false是合法的返回值。处理用户输入并因此得到非常随意的输入值的函数通常可以返回false

一些例子:

  • getDatabaseConnection()是在投掷RuntimeException完全正确的或类似的,如果它不能建立与数据库的连接。这是特殊情况在这种情况下,无法继续工作。
  • transformFooIntoBar(Foo $foo)如果无法返回Bar实例,则无论出于何种原因,都可以抛出某种形式的异常。该功能具有明确的目的和类型检查输入值。如果在这样清晰的条件下不能完成工作,那么显然是错误的,必须修正。埃尔戈,一个例外。
  • checkIfUserExists($id)很可能会返回false,因为它的工作是返回大拇指或拇指向下。鉴于此职位描述,不存在的用户不是特殊情况

在哪里捕捉抛出的异常取决于你想处理它的地方。数据库连接错误应该可能在调用堆栈的顶部被捕获,因为如果数据库关闭,您可能无法做任何事情。另一方面,如果某个模块正在调用某个子模块,并且有一半模块期望该子模块发生故障并且/或者在发生故障时有应急计划,则该模块可能会捕获该子模块的异常并继续执行其工作。例如getRSSUpdates()拨打电话HTTP::fetchContents($url)。如果URL返回404,则HTTP模块可能会引发异常,因为在这种情况下它不能返回内容。 getRSSUpdates()函数为此做好了准备,并将此情况作为“此时没有更新”处理。