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 — 异常克隆
以上部分来自官网:http://php.net/manual/zh/clas...
下面是参考《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;
}
在框架的入口注册异常处理函数:先引入对应的模板文件,然后在模板文件中直接显示出错误信息
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。