首先很明确的是 try ... catch ... 是一个语言结构。那既然如此就不能用函数参数类型限定的方式去理解 catch 后面的括号里的 Exception 了。 如果这里没有 Exception,比如这样写: <?php try { } catch ($e) { } 你会得到一个错误: Parse error: parse error, expecting "identifier (T_STRING)"' or "namespace (T_NAMESPACE)"' or `"\\ (T_NS_SEPARATOR)"' in ... 显而易见,这里的 Exception 是一种『预期』,用于判断捕获到的异常类型的。 如果用类的情景来翻译一下,大概就类似于: <?php $e = new Exception; if ($e instanceof Exception) { # do something ... } 如果你是多个 catch,比如: <?php try { throw new CustomException("Error Processing Request", 1); } catch (CustomException $e) { echo 1; } catch (Exception $e) { echo 2; } class CustomException extends Exception { } 虽然我们抛出的异常也属于 Exception,但是 catch 捕捉到第一个就停止了,所以这里只会输出 1,如果互换 catch (CustomException $e) 和 catch (Exception $e) 也一样。 这也和以下情况相同: <?php $e = new CustomException; if ($e instanceof CustomException) { echo 1; } elseif ($e instanceof Exception) { echo 2; } class CustomException extends Exception { }
首先很明确的是 try ... catch ... 是一个语言结构。
那既然如此就不能用函数参数类型限定的方式去理解 catch 后面的括号里的 Exception 了。
如果这里没有 Exception,比如这样写:
你会得到一个错误:
显而易见,这里的 Exception 是一种『预期』,用于判断捕获到的异常类型的。
如果用类的情景来翻译一下,大概就类似于:
如果你是多个 catch,比如:
虽然我们抛出的异常也属于 Exception,但是 catch 捕捉到第一个就停止了,所以这里只会输出 1,如果互换
catch (CustomException $e)
和catch (Exception $e)
也一样。这也和以下情况相同: