我完全理解(try/throw/catch
)块的细微差别。
我不明白的是:
如果我们无论如何都要在try
块中使用IF
(或任何控制结构)来测试条件是否满足,那么,如果测试结果为假,则"throw
"是一个异常,那么。。。在我看来:抛出/生成异常是有用的;因为如果不满足条件,我们可以简单地打印一条错误消息,调用一个函数,实例化一个类,重定向到另一个位置,等等
另一种情况是,例如,如果一个变量没有初始化,我们将该变量封装在try{}
块中,回显该变量,从那时起,所有事情都将由catch()
块处理,因为try
块会引发错误;并且由于try/catch
块彼此交谈,catch块将捕获源自其对应的try块的每个错误。但是,您可以在yout-try块中设置自定义错误消息(可选)。
到目前为止我读到的内容:搜索的每个结果:如果vs.尝试
我确实看到了区别。
但我不明白为什么有些人选择try/throw/catch
而不是if...else...switch...while
。。。等
不过,就我所见,try/throw/catch
可以用于调试。
if/then
异常的一个好处是可以将try/catch
封装在一大块代码中。如果块中的任何位置发生错误,它将被触发。
try {
$db = db_open();
$statement = $db->prepare($sql);
$result = $statement->execute($params);
} catch (Exception $e) {
die($e->getMessage());
}
使用if/then
,您必须在每个步骤执行一个测试。
$db = db_open();
if (!$db) {
die(db_connect_error());
}
$statement = $db->prepare($sql);
if (!$statement) {
die(db_error($db));
}
$result = $statement->execute($params);
if (!$result) {
die(db_error($db));
}
正如您所说,在try/catch块中抛出异常并立即捕获它会带来大量开销。
try {
if (...) {
// good, do no throw
} else {
throw new Exception();
}
} catch ($e) {
// handle exception
}
应替换为:
if (...) {
// good
} else {
// handle error, no exception
}
例外情况很有用,因为它们会冒泡。所以想象一下,如果你有这样的代码:
function bla() {
try {
tryToDoSomething();
} catch ($e) {
// handle error
}
}
function tryToDoSomething() {
if ($somethingNotAvailable) {
throw new Exception();
}
doSomething();
}
在这种情况下,定义try/catch的函数不是抛出异常的函数。tryToDoSomething()不知道如何处理错误,所以它会让父方法来处理它。异常可能会在调用堆栈中冒泡,直到有人抓住它并处理错误。这就是异常实际有用的原因:)