PHP try catch语句的用法(非常详细,附带实例)
异常处理用于在指定的错误(异常)情况发生时改变脚本的正常流程。当异常被触发时,通常会发生以下动作:
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 catch 代码块。如果异常没有被捕获,而且又没有使用 set_exception_handler() 做相应的处理,就会发生一个严重的错误,并且输出 Uncaught Exception(未捕获异常)的错误消息。
下面的实例抛出一个异常,同时不去捕获它。

图 1 没有捕获异常
如果想避免出现上面的错误,需要创建适当的代码来处理异常。处理异常的程序应当包括如下几个部分:
【实例】try catch 代码块的用法。
运行后结果为:
例如:
运行后结果如图所示:
- 当前代码状态被保存;
- 代码执行被切换到预定义的异常处理器函数;
- 根据情况,处理器也许会从保存的代码状态重新开始执行代码,终止脚本执行,或从代码中另外的位置继续执行脚本。
当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 catch 代码块。如果异常没有被捕获,而且又没有使用 set_exception_handler() 做相应的处理,就会发生一个严重的错误,并且输出 Uncaught Exception(未捕获异常)的错误消息。
下面的实例抛出一个异常,同时不去捕获它。
<?php // 创建带有异常的函数 function checkNum($number) { if($number > 1) { throw new Exception("Value must be 1 or below"); } return true; } // 抛出异常 checkNum(2); ?>运行后结果如下图所示。由于没有捕获异常,因此出现了下面的错误提示消息。

图 1 没有捕获异常
如果想避免出现上面的错误,需要创建适当的代码来处理异常。处理异常的程序应当包括如下几个部分:
- try 代码块:使用异常的函数应该位于 try 代码块内。若没有触发异常,则代码将照常继续执行。但是如果异常被触发,就会抛出一个异常。
- throw 代码块:这里规定如何触发异常。每一个 throw 必须对应至少一个 catch。
- catch 代码块:catch 代码块会捕获异常,并创建一个包含异常信息的对象。
【实例】try catch 代码块的用法。
<?php // 创建可抛出一个异常的函数 function checkNum($number) { if($number > 1) { throw new Exception("数值必须小于或等于 1"); } return true; } // 在 try 代码块中触发异常 try { checkNum(2); // 如果没有异常,则会显示以下信息 echo '没有任何异常'; } // 捕获异常 catch(Exception $e) { echo '异常信息:' . $e->getMessage(); } ?>分析程序:
- 首先创建 checkNum() 函数,用于检测数字是否大于 1。如果是,则抛出一个异常;
- 在 try 代码块中调用 checkNum() 函数;
- checkNum() 函数中的异常被抛出;
- catch 代码块接收到该异常,并创建一个包含异常信息的对象($e);
- 通过从这个 exception 对象调用 $e->getMessage(),输出来自该异常的错误消息。
运行后结果为:
异常信息:数值必须小于或等于 1
由于抛出异常后捕获了异常,因此出现了下面的提示消息。处理多个异常
用户可以使用多个 if…else 代码块,或一个 switch 代码块,或者嵌套多个异常。这些异常能够使用不同的 exception 类,并返回不同的错误消息。例如:
<?php class customException extends Exception{ public function errorMessage(){ // 定义错误信息 $errorMsg = '错误消息的行:'.$this->getLine().' in '.$this->getFile().':'.$this->getMessage().' 不是一个有效的邮箱地址'; return $errorMsg; } } $email = "someone@yahoo.com"; try{ // 检查是否符合条件 if(filter_var($email, FILTER_VALIDATE_EMAIL) === FALSE) { // 如果邮箱地址无效,则抛出异常 throw new customException($email); } // 检查邮箱是否是雅虎邮箱 if(strpos($email, "yahoo") !== FALSE){ throw new Exception("$email 是一个雅虎邮箱"); } } catch(customException $e) { echo $e->errorMessage(); } catch(Exception $e) { echo $e->getMessage(); } ?>上面的代码测试了两种条件,如果任一条件不成立,则抛出一个异常。分析一下程序的执行过程:
- customException() 类是作为旧的 exception 类的一个扩展而创建的。这样它就继承了旧类的所有属性和方法;
- 创建 errorMessage() 函数。若 email 地址不合法,则该函数返回一个错误消息;
- 执行 try 代码块,在第一个条件下不会抛出异常;
- 由于 email 含有字符串 yahoo,因此第二个条件会触发异常;
- catch 代码块会捕获异常,并显示恰当的错误消息。
运行后结果如图所示:
someone@yahoo.com 是一个雅虎邮箱