php处理异常,PHP基础:异常处理Exception

Exception是所有异常的基类。

Exception {

/* 属性 */

protected string $message ;

protected int $code ;

protected string $file ;

protected int $line ;

/* 方法 */

public __construct ([ string $message = "" [, int $code = 0 [, Exception $previous = NULL ]]] )

final public string getMessage ( void )

final public Exception getPrevious ( void )

final public int getCode ( void )

final public string getFile ( void )

final public int getLine ( void )

final public array getTrace ( void )

final public string getTraceAsString ( void )

public string __toString ( void )

final private void __clone ( void )

}

Exception::__construct — 异常构造函数

Exception::getMessage — 获取异常消息内容

Exception::getPrevious — 返回异常链中的前一个异常

Exception::getCode — 获取异常代码

Exception::getFile — 获取发生异常的程序文件名称

Exception::getLine — 获取发生异常的代码在文件中的行号

Exception::getTrace — 获取异常追踪信息

Exception::getTraceAsString — 获取字符串类型的异常追踪信息

Exception::__toString — 将异常对象转换为字符串

Exception::__clone — 异常克隆

下面是参考《PHP5权威编程》

try,catch,throw

异常处理使用3中语言结构:try,catch,throw。为了处理一个异常,需要在try代码块中运行一些代码

try{

$article->display();

}

try代码只是PHP留意在代码块里的代码运行时产生的异常。如果出现了异常,它马上被传递给紧跟着try代码块的一个或者更多的获取代码块中:

catch(Exception $e){

die($e->getMessage());

}

变量$e似乎包含了一个对象。它包含的异常的确是对象,唯一条件就是必须从Exception类继承。

如果想在你自己的代码中产生一个异常,使用throw语句:

$fp = @fopen($fileName,'r');

if(!is_resource($fp)){

throw new FileException('could not open');

}

可以看出异常是个对象,throw只是简单的使用这个特定的对象作为异常的一部分

可以定义异常:

class IOException extends Exception{}

class FileException extends Exception{}

异常类中不需要成员变量或者方法:你需要的所有内容都已经在内置Exception类中定义了。

PHP在catch语句中使用所谓的“是一”关系对类的名字和异常对象做检查。也就是,如果该异常对象是一个catch类的实例,或者其子类的实例,PHP就执行catch代码

如:

try{

$article->display();

}catch(IOException $e){

print 'IOException';

}catch(FileException $e){

print 'FileException';

}

这个例子中IOException的catch同时捕获到IOException和FileException,因为FileException是从IOException继承的

如果每一个catch都没能捕获到异常,那么会将该异常传递给调用的函数,给调用的函数提供机会来捕获。

如果异常在任何地方都没能捕获,那么PHP会提供最后的机会:异常处理函数。默认情况下PHP打印出错误信息、类的名字和一个堆栈信息。

通过调用set_exception_handler(),可以注册异常处理函数

function my_exception(Exception $e){

print 'error is '.$e->getMessage();

exit;

}

set_exception_handler('my_exception');

这个函数用来处理所有没能在catch中获取的异常,异常处理函数中不能再抛出异常。

看看ThinkPHP中的做法:

set_exception_handler(array('Think','appException'));

static public function appException($e) {

halt($e->__toString());

}

static public function halt($error) {

$e = array();

if (APP_DEBUG || IS_CLI) {

//调试模式下输出错误信息

if (!is_array($error)) {

$trace = debug_backtrace();

$e['message'] = $error;

$e['file'] = $trace[0]['file'];

$e['line'] = $trace[0]['line'];

ob_start();

debug_print_backtrace();

$e['trace'] = ob_get_clean();

} else {

$e = $error;

}

if(IS_CLI){

exit(iconv('UTF-8','gbk',$e['message']).PHP_EOL.'FILE: '.$e['file'].'('.$e['line'].')'.PHP_EOL.$e['trace']);

}

} else {

//否则定向到错误页面

$error_page = C('ERROR_PAGE');

if (!empty($error_page)) {

redirect($error_page);

} else {

$message = is_array($error) ? $error['message'] : $error;

$e['message'] = C('SHOW_ERROR_MSG')? $message : C('ERROR_MESSAGE');

}

}

// 包含异常页面模板

$exceptionFile = C('TMPL_EXCEPTION_FILE',null,THINK_PATH.'Tpl/think_exception.tpl');

include $exceptionFile;

exit;

}

在框架的入口注册异常处理函数:先引入对应的模板文件,然后在模板文件中直接显示出错误信息

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值