如何在PHP中使用异常(附代码)

101 阅读2分钟

有时错误是不可避免的。

一些完全无法预料的事情发生了。

但很多时候,我们可以提前考虑,写一些可以拦截错误的代码,并在错误发生时做一些合理的事情。比如向用户显示一个有用的错误信息,或者尝试一个变通方法。

我们使用异常来做到这一点。

异常是用来让我们这些开发者意识到一个问题的。

我们将一些有可能引发异常的代码包裹在一个try 块中,紧接着我们有一个catch 块。如果在try块中出现了异常,这个catch块将被执行:

try {
  //do something
} catch (Throwable $e) {
  //we can do something here if an exception happens
}

注意到我们有一个Exception 对象$e 被传递给catch 块,我们可以检查这个对象以获得更多关于异常的信息,像这样:

try {
  //do something
} catch (Throwable $e) {
  echo $e->getMessage();
}

让我们来做一个例子。

例如,我错误地将一个数字除以0:

echo 1 / 0;

这将触发一个致命的错误,程序在这一行被停止了:

将该操作包裹在一个尝试块中,并在捕获块中打印出错误信息,程序成功结束,告诉我问题所在。

try {
  echo 1 / 0;
} catch (Throwable $e) {
  echo $e->getMessage();
}

当然这只是一个简单的例子,但你可以看到它的好处:我可以拦截这个问题。

每个异常都有一个不同的类。例如,我们可以把这个捕捉为 DivisionByZeroError这让我可以过滤可能的问题,并以不同的方式处理它们。

我可以在最后为任何可抛出的错误设置一个捕获块,像这样。

try {
  echo 1 / 0;
} catch (DivisionByZeroError $e) {
  echo 'Ooops I divided by zero!';
} catch (Throwable $e) {
  echo $e->getMessage();
}

而且我还可以在这个try/catch结构的末尾附加一个finally {} 块,在代码成功执行没有问题,或者有一个catch之后执行一些代码。

try {
  echo 1 / 0;
} catch (DivisionByZeroError $e) {
  echo 'Ooops I divided by zero!';
} catch (Throwable $e) {
  echo $e->getMessage();
} finally {
  echo ' ...done!';
}

你可以使用PHP提供的内置异常,但你也可以创建你自己的异常。