当涉及到处理错误时,在什么意义上,使用Exceptions比使用if.else..switch..等更好


When it comes to handle errors, in what sense, using Exceptions are better that utilize if...else...switch... etc.?

我完全理解(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()不知道如何处理错误,所以它会让父方法来处理它。异常可能会在调用堆栈中冒泡,直到有人抓住它并处理错误。这就是异常实际有用的原因:)