manual-php
Version:
112 lines (92 loc) • 2.71 kB
Markdown
# 基本语法
PHP 有一个类似于其他编程语言的异常模型。一个异常可以在 PHP 中被抛出和捕获。代码可以被包围在 `try` 块中,以便于捕获潜在的异常。每个 `try` 块中必须至少有一个相应的 `catch` 或 `finally` 块。抛出的对象必须是 `Exception` 类或 `Exception` 类的子类的一个实例。尝试抛出一个非对象将导致 PHP 致命错误。可以使用多个 `catch` 块来捕获不同类别的异常。正常执行(当 `try` 块中没有抛出异常时)将在顺序定义的最后一个 `catch` 块之后继续。可以在 `catch` 块中抛出(或重新抛出)异常。 `try` 中的代码一旦抛出异常,代码将停止运行,直接执行 `catch` 中的代码, PHP 将尝试查找第一个匹配的 `catch` 块。如果未捕获异常,则将发出带有 `Uncaught Exception ...` 消息的 PHP 致命错误,除非已使用 `set_exception_handler()` 函数定义了处理程序。也可以在 `catch` 块之后指定 `finally` 块。 `finally` 块中的代码将始终在 `try` 和 `catch` 块之后执行,无论是否抛出异常,并且在正常执行恢复之前。
```php
/**
* Throwing an exception or return a string.
*
* @param bool $option
* @return string
*/
function foo(bool $option): string
{
if ($option) {
throw new Exception('bar');
}
return 'foo';
}
try {
var_dump(foo(false));
var_dump(foo(true));
} catch (Exception $e) {
var_dump($e->getMessage());
}
var_dump('baz');
// string(3) "foo"
// string(3) "bar"
// string(3) "baz"
```
使用 `finally` 块进行异常处理。
```php
/**
* Throwing an exception or return a string.
*
* @param bool $option
* @return string
*/
function foo(bool $option): string
{
if ($option) {
throw new Exception('bar');
}
return 'foo';
}
try {
var_dump(foo(false));
} catch (Exception $e) {
var_dump($e->getMessage());
} finally {
var_dump(false);
}
try {
var_dump(foo(true));
} catch (Exception $e) {
var_dump($e->getMessage());
} finally {
var_dump(true);
}
var_dump('baz');
// string(3) "foo"
// bool(false)
// string(3) "bar"
// bool(true)
// string(3) "baz"
```
嵌套异常。
```php
class Foo
{
/**
* Throwing an exception.
*
* @param void
* @return void
*/
public function method()
{
try {
try {
throw new Exception('foo');
} catch (Exception $e) {
throw $e;
}
} catch (Exception $e) {
var_dump($e->getMessage());
}
}
}
$foo = new Foo();
$foo->method(); // string(3) "foo"
```