注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

阿飘的博客

十里平湖霜满天 寸寸青丝愁华年

 
 
 

日志

 
 

PHP 异常与异常处理  

2014-10-21 22:04:50|  分类: php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一般处理方法
Try - 使用异常的函数应该位于 "try"
代码块内。如果没有触发异常,则代码将
照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"。
Catch - "catch"
代码块会捕获异常,并创建一个包含异常信息的对象。
Try{
//
可能抛出异常的代码块
throw new MyException();
//
从这里开始,
try
代码块内的代码将不会被执行
echo "never executed";
}catch(myException $e){
//
处理异常信息
echo $e->getMessage();
}
如果捕获了异常,
就要对它进行适当的处理。
不要捕获异常之后又把它丢弃,
不予
理睬。
3
、多个异常
如果确定
try
代码块内可能抛出多个已定义的异常,

catch
语句中尽可能指定具
体的异常类型,必要时使用多个
catch
,不要试图处理所有可能出现的异常。
Class CustomException extents Exception{};
try
 {
 //
条件
A
 if(A)
  {
  
//
如果触发条件
A
,抛出自定义异常
 customException
  
throw new CustomException("customException");
  } 
 if(B)
  {
  
//
如果触发条件
B
,抛出异常
Exception
  
throw new Exception("Exception");
  }
 }
//
第一个
catch
catch (CustomException $e)
 {
 
echo $e->getMessage();
 }
//
第二个
catch
catch(Exception $e)
 {
 
echo $e->getMessage();
 }
4
、重新抛出异常
脚本应该对用户隐藏系统错误。
对程序员来说,
系统错误也许很重要,
但是用户对它
们并不感兴趣。
为了让用户更容易使用,
可以再次抛出带有对用户比较友好的消息的异常。
Class CustomException extents Exception{};
try{
//
抛出异常
Exception
 
throw new Exception("Exception");
 }catch(Exception $e)
 {
//
抛出新的自定义异常,其中使用对用户比较友好的消息。
 
throw new CustomException("
对不起,程序运行出错!
");
 }
5
、顶层异常处理器
有时候我们希望统一处理抛出的异常,
或者说,
为了保证所有可能抛出的异常都被捕获
到,我们会在顶层设置一个自定义异常处理器,来捕获所有未被捕获的异常。
//
自定义异常处理器
function myException($e)
{
echo "Exception: " , $e->getMessage();
}
//
设置自定义异常处理器
set_exception_handler('myException');
//
抛出一个异常,不使用
catch
进行捕获
throw new Exception('Uncaught Exception occurred');
//
输出:“
Exception:Uncaught Exception occurred

四、
Zend Framework
中的异常处理
Zend
Framework
中的
MVC
元件利用了一个前端控制器,这意味着到一个站点的所有
请求都将通过单一入口。
因此,
所有的异常最终将起泡到前端控制器,
开发人员可在一个位
置处理这些异常。
但是,异常消息以及回溯信息可能含有敏感的系统信息,比如
SQL
语句,文件位置等
等。为了保护站点,
Zend_Controller_Front
默认将捕捉所有异常并注册到响应对象,响应对
象默认不会显示异常消息。
Zend Framework

MVC
中通过
Zend_Controller_Front
注册的异常处理插件,
从响应对
象中捕捉了异常,然后重定向到一个一般性的错误页面或者主页。
Class NewException extents Zend_Exception{}
1
、异常处理方法
Zf
默认的错误处理插件
Zend_Controller_Plugin_ErrorHandlr
提供了一个活动的插
件,用来处理从程序抛出的异常,包括那些从缺控制器或动作的来的结果。
// Zend_Controller_Front
前端控制器注册相关插件
require_once 'Zend/Controller/Plugin/ErrorHandler.php';
$this->_plugins->registerPlugin(new
Zend_Controller_Plugin_ErrorHandler(),
100);
ErrorHandler
能够动态地监视两种来源的异常:由于缺失控制器或动作方法而产生的
异常,和动作控制器里产生的异常,除此之外,它不抓取由其它插件或路由产生的异常。
ErrorHandler
检查的异常被存在响应对象里,如果发现有异常,它试图转发给注册的
错误处理器。
//
分发器循环代码中的一部分
//
如果有对
route
获得的模块名、控制器名、动作名有修改的,在这里执行
$this->_plugins->preDispatch($this->_request);
try {
//
开始分发
$dispatcher->dispatch($this->_request, $this->_response);
} catch (Exception $e) {
//
如果
$this->throwExceptions()

true
,表示通知前端控制器,由开发人员来
处理异常,而不是让响应对象收集或者使用错误处理器插件
if ($this->throwExceptions()) {
throw $e;
}
//
异常存入响应对象
$this->_response->setException($e);
}
// postDispatch()
执行阶段开始渲染
view
$this->_plugins->postDispatch($this->_request);
前端控制器中还有一个
returnResponse()
方法,如果传入
true
值,
dispatch()
将不
渲染响应对象,而是将其返回。获得响应对象后,可通过
isException()
测试是否捕捉到异
常,然后通过
getException()
获取异常。
//
检查响应对象是否有异常
if ($response->isException()) {
//
获取异常
    $exceptions = $response->getException();
    //
其它处理方式
}
如果在派遣错误处理器时发生异常,
它将告诉前端控制器抛出异常,
并重新抛出响应对
象注册的最后一个异常。
如果发生异常,
它将转向一个错误处理控制器。
该处理器会涵盖大
多数异常情况,并能够优美的处理控制器或者动作缺失异常。
2
、异常的打印显示
默认的错误控制处理被假定为
ErrorController
以及其中定义的
errorAction
方法,对应
视图脚本
error.phtml
.
$error = $this->_getParam('error_handler');
获取由
ErrorHandler
插件转
发来的对象,在
index
方法内做统一处理,最后在前端显示。
<?php
require_once 'Zend/Controller/Action.php';
class ErrorController extends Zend_Controller_Action
{
$error = $this->_getParam('error_handler');
public function errorAction(){}
}
?>
ErrorController
不是必须的,但是通过
ErrorController
可以打印异常堆栈,查找异常位
置,定位异常,方便找到解决方法。对于异常的处理可以在这里进行统一的处理。
  评论这张
 
阅读(313)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017