我一直想知道为什么要在我的 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/