php - 为什么以及如何在此示例 PHP 代码中使用异常?

标签 php exception exception-handling error-handling

我一直想知道为什么要在我的 PHP 中使用异常。我们来看一个简单的例子:

class Worker
{
 public function goToWork()
 {
  return $isInThatMood ?
  // Okay, I'll do it.
  true : 
  // In your dreams...
  false;
 }
}

$worker = new Worker;
if (!$worker->goToWork())
{
 if (date('l',time()) == 'Sunday')
  echo "Fine, you don't have to work on Sundays...";
 else
  echo "Get your a** back to work!";
}
else
 echo "Good.";

我有理由对这种代码使用异常吗?为什么?代码将如何构建?

那可能产生错误的代码呢:

class FileOutputter
{
 public function outputFile($file)
 {
  if (!file_exists($file))
   return false;
  return file_get_contents($file);
 }
}

为什么我要在上述情况下使用异常?我有一种感觉,异常可以帮助您识别问题的类型,发生的问题,对吗?

那么,我是否在这段代码中适本地使用了异常:

class FileOutputter
{
 public function outputFile($file)
 {
  if (!file_exists($file))
   return throw new Exception("File not found.",123);
  try
  {
   $contents = file_get_contents($file);
  }
  catch (Exception $e)
  {
   return $e;
  }
  return $contents;
 }
}

还是那么穷?现在底层代码可以做到这一点:

$fo = new FileOutputter;
try
{
 $fo->outputFile("File.extension");
}
catch (Exception $e)
{
 // Something happened, we could either display the error/problem directly
 echo $e->getMessage();
 // Or use the info to make alternative execution flows
 if ($e->getCode() == 123) // The one we specified earlier
  // Do something else now, create "an exception"
}

还是我完全迷路了?

最佳答案

什么时候应该使用异常?

您使用异常来表示异常情况;也就是说,阻止方法履行其契约(Contract)的事情,并且不应该在该级别发生。

例如,您可能有一个方法 Record::save(),它将对记录的更改保存到数据库中。如果由于某种原因无法完成此操作(例如发生数据库错误或数据约束被破坏),那么您可以抛出异常以指示失败。

如何创建自定义异常(exception)?

异常通常被命名为指示错误的性质,例如,DatabaseException。您可以子类化 Exception 以这种方式创建自定义命名的异常,例如

class DatabaseException extends Exception {}

(当然,您可以利用继承的优势为该异常提供一些额外的诊断信息,例如连接详细信息或数据库错误代码。)

什么时候不应该使用异常?

再考虑一个例子;一种检查文件是否存在的方法。如果文件不存在,这可能不会抛出异常,因为该方法的目的是执行上述检查。但是,打开文件并执行某些处理的方法可能抛出异常,因为文件应该存在等。

最初,并不总是很清楚什么时候是异常(exception),什么时候不是。与大多数事情一样,随着时间的推移,经验会告诉您什么时候应该和不应该抛出异常。

为什么要使用异常而不是返回特殊的错误代码等?

异常的有用之处在于它们会立即跳出当前方法并向上调用堆栈,直到它们被捕获和处理,这意味着您可以将错误处理逻辑移到更高的位置,尽管理想情况下,不要太高.

通过使用清晰的机制来处理失败情况,当发生错误时,您会自动启动错误处理代码,这意味着您可以避免处理各种必须检查的神奇哨兵值,或者更糟的是,用于区分一系列不同可能性的全局错误标志。

关于php - 为什么以及如何在此示例 PHP 代码中使用异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/935490/

相关文章:

php - SET 排序规则和字符 UTF8 - Mysql PDO

php - 我怎样才能有效地添加图像处理得到这个脚本

php - fatal error : Uncaught PDOException: Column cannot be null (BUT it isn't null. ..)

java - 抛出和捕获异常的影响大吗?

c# - 当一个任务引发另一个任务与第一个任务同步时,Task.WaitAll挂起

c# - 事务必须在连接可用于执行sql语句之前被释放

migration - 更新到 PHP 5.3,禁用弃用函数警告

ios - 更好的解决方案来处理未实现的协议(protocol)所需的方法

带 Applet 的 java.lang.InstantiationException

php - Symfony 2.2 扩展 ExceptionController