php异常处理的一般格式:
try if(false){ //在预估会出错的地方设置并抛出异常 throw new Exception("出错了"); } }catch(Exception $e){ $str = '捕获到错误:'; $str .= $e->getMessage(); $str .= ',在文件:'; $str .= $e->getFile(); $str .= '的第:' . $e->getLine() . '行'; exit($str); }finally{ //释放资源 }
文件读写与异常结合,主要看异常处理,请忽略文件操作:
<?php header("Content-type:text/html;Charset=utf-8"); $fileName = './testFile.txt'; $somecontent = "<b style='color:blue'>ok</b>,这就是要写入的文字内容!<br>" . PHP_EOL; try{ // 1.写文件 //检查文件是否存在,没有文件时抛出异常 if(!file_exists($fileName)){ //没有文件时,以读打开创建文件 $handle = fopen($fileName, 'w'); if($handle) throw new Exception("没有此文件!"); }else{ //有文件时,以追加方式打开文件(文件指针指向文件末尾) $handle = fopen($fileName, 'a'); //检查文件是否能写入,不能写入是因为文件权限没有打开(linux下是:chmod a+w ./testFile.txt)并抛出异常 if(is_writable($fileName)){ //不能写入时抛出异常,一般情况下资源没打开时才会出错,向上第二行 $handle 注释后会抛出异常 if (@fwrite($handle, $somecontent) === FALSE) { //写文件 throw new Exception("不能写入到文件{$fileName}!"); } }else{ throw new Exception("文件无权写入!"); } } // 2.读文件 if(file_exists($fileName)){ $handle = fopen($fileName, 'r'); if(filesize($fileName) > 0) $contents = fread($handle, filesize($fileName)); //读文件 echo $contents; //显示内容 }else{ throw new Exception('文件获取时发生错误!'); } }catch(Exception $e){ $show = '<span style="color:red">捕获到异常:</span><strong>'; $show .= $e->getMessage(); $show .= '</strong>,<span style="color:#789">在文件'; $show .= $e->getFile(); $show .= '第' . $e->getLine() . '行</span>'; exit($show); // finally 在异常或正常情况下都被访问,一般用于关闭资源 }finally{ if(isset($handle)) fclose($handle); } echo '<p style="color: #f4a">这是正常显示的内容!</p>';
多异常情况下的案例:
<?php /*自定义的一个异常处理类,但必须是扩展内置异常处理类的子类*/ class myException extends Exception{ //重定义构造器,使第一个参数 $message 为必须被指定的属性 public function __construct($message, $code = 0){ //可以在这里定义一些自已的代码 //建议同时调用 parent::__construct() 来检查所有的变量是否已被赋值 parent::__construct($essage, $code); } //重写父类中继承过来的方法,自定义字符串输出的样式 public function toString() { return __CLASS__ . ": [". $this->code . "]:" . $this->message . "<br>"; } //为这个异常自定义一个处理方法 public function customFunction() { echo"按自定义的方法处理出现的这个类型的异常"; } } /*创建一个用 于测试自定义扩展的异常类TestException */ class TestException{ public $var; //用来判断对象是否创建成功的成员属性 function __construct ($value = 0) { //通过构造方法的传值决定抛出的异常 switch($value) { //对传入的值进行选擇性的判断 case 1: //传入参数1,则抛出自定义的异常对象 throw new MyException("传入的值“1”是一个无效的参数", 5); break; case 2: //传入参数2, 则抛出PHP内置的异常对象 throw new Exception("传入的值“2”不允许作为一个参数", 6); break; default: //传入参数合法,则不抛出异常 $this->var = $value; break; //为对象中的成员属性赋值 } } } /*示例1:在没有异常时,程序正常执行,try中的代码全部执行,并不会执行任何catch区块*/ try{ $testObj = new TestException() ; //使用默认参数创建异常的测试类对象 echo "***********<br>"; //没有抛出异常,这条语句就会正常执行 }catch(MyException $e){ //捕获用户自定义的异常区块 echo "捕获自定义的异常: {$e}<br>"; //按自定义的方式输出异常消息 $e->customFunction() ; //可以调用自定义的异常处理方法 } catch(Exception $e) { //捕获PHP内置的异常处理类的对象 echo "捕获默认的异常: ". $e->getMessage(). "<br>"; //输出异常消息 } echo '<hr>'; var_dump($testObj) ; //判断对象是否创建成功,如果没有任何异常,则创建成功 echo '<hr>'; /*示例2:抛出自定义的异常,通过自定义的异常处理类捕获这个异常并处理*/ try{ $testobj1 = new TestException(1); //传入1时,抛出自定义异常 echo '************<br>'; //这条语句不会被执行 }catch(MyException $e){ //这个catch区块中的代码将被执行 echo "捕获自定义的异常:{$e}<br>"; $e->customFunction(); }catch(Exception $e){ //这个catch区块不会被执行 echo "捕获默认的异常:" . $e->getMessage() . "<br>"; } echo '<hr>'; var_dump ($testObj1); //有异常产生,这个对象没有创建成功 echo '<hr>'; /*示例3: 抛出内置的异常,通过自定义的异常处理类捕获这个异常并处理*/ try{ $testObj2 = new TestException(2) ; //传入2时,抛出内置异常 echo '*******++<br>'; //这条语句不会被执行 }catch(MyException $e) { //这个catch区块不会被执行 echo "捕获自定义的异常:{$e}<br>"; $e->customFunction(); }catch(Exception $e){ //这个catch区块中的代码将被执行 echo "捕获默认的异常: ", $e->getMessage() . "<br>"; } echo '<hr>'; var_dump($testObj2) ; //有异常产生,这个对象没有创建成功