嗯,它们非常相似。在 PHP 原生错误处理中,您可以使用 trigger_error($error, [$level]) 抛出您自己的错误,因为您可以使用 throw new MyException($error) 抛出您自己的异常;您可以使用set_error_handler() 设置默认错误处理程序,它将以您自己的方式管理所有PHP 错误(解析除外),因为您可以使用set_exception_handler() 设置默认异常处理程序。 PHP 原生错误和异常都会以某种方式自动触发/抛出:编译脚本的 PHP 原生错误,如果您使用特定项目(例如 (PDO) 或其他内容时出现异常)。
现在让我们用不同的方法尝试相同的代码:
使用 PHP 原生错误,您可以执行以下操作:
$db = new Database();
if ($db === NULL) { trigger_error("Cannot connect to the database", E_USER_ERROR); }
$result = $db->query("UPDATE charlieiscool SET iloveunicorns = 1 WHERE userid = 1");
if (!$result) { trigger_error("Error updating table", E_USER_ERROR); }
$file = 'log.php';
if (!file_exists($file) or !file_get_contents($file)) { trigger_error("$file not found", E_USER_ERROR); }
require($file);
我认为这并不需要任何解释。如果触发了错误,则会跳过整个脚本并且您会看到错误。没有更多的事情可以做;你可以设置E_USER_ERROR 或E_USER_NOTICE 或E_USER_WARNING 并以不同的方式处理它们,但你没有那么大的选择。现在看一下try{} catch() {} 块的可能 OOP 方法:
try {
$db = new Database();
if (!$db) { throw new DBEx("Cannot connect to the database"); }
$result = $db->query("UPDATE charlieiscool SET iloveunicorns = 1 WHERE userid = 1");
if (!$result) { throw new QueryEx("Query failed"); }
} catch (PDOException $e) {
echo $e->getMessage();
} catch (DBEx $e) {
$e->customFunction();
} catch (QueryEx) {
$e->customFunctionForQuery();
}
try {
$file = 'log.php';
if (!file_exists($file) or !file_get_contents($file)) { throw new FileEx("$file does not exists"); }
require($file);
} catch (FileEx) {
$e->fileGenerate();
$e->logError();
}
主要区别在于,如果第一个 try{} 块抛出异常,则第二个 try{} 将以任何方式执行。事实上,如果抛出异常,则只会跳过该 try{} 块内的其余脚本。
另一个区别(我最喜欢的那个)是您可以创建多个类(扩展 mains Exception 或 PDOException 或其他)并自定义您的错误处理行为。您有无限的可能性来自定义您的课程、添加功能、编辑现有的课程。您可以添加特定的函数(例如$e->fileGenerate();)并在需要时在catch() {} 块内调用它们。
还要注意,如果您希望在发生错误时停止整个脚本,则意味着该错误需要trigger_error();相反,如果您希望错误只停止与该错误相关的特定代码块,那么是时候尝试捕获了。
你不应该用一个代替另一个,你应该使用一个并排评估每个错误。
顺便说一下PDO::setAttribute() 更改数据库处理程序中的默认值和选项。例如,您可以使用$dbh->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); 更改您的默认提取(在PDOStatement::fetch() 中使用)。
参考资料: