动态网页PHP中错误信息的处理方法 [ 网站地图 ]

发表于:2010-1-25 浏览:54 作者: 来源:站长资讯网

关键字:PHP,错误信息

描述:动态网页PHP中错误信息的处理方法 已经玩php一段时间了,基本是from0开始的,经常出现的问题也很多,慢慢的可以熟练的查询文档了,而且,经验也不是很多。 先lookhere。: error_reporting(1048);/

动态网页PHP中错误信息的处理方法

已经玩php一段时间了,基本是from 0开始的,经常出现的问题也很多,慢慢的可以熟练的查询文档了,而且,经验也不是很多。

先look here。:
 
error_reporting(1048);//1,2,4,7,...,1048

ob_start();

session_start();

date_default_timezone_set(‘Asia/Shanghai‘);

php的递给调用会吃掉很多的内存。

一般的,不要太多的使用define。

在类的构造和属性器方面,5已经做了很多的工作,克服的bug就不说了,__系列的函数都有一些看点,也是支持static的。
  
按照我现在的写过的程序,很少用到框架页面的,我感觉在php里面速度不在是一个问题。
 
注意类的调用次序,特别是已经extends的,准确的释放掉内存。
 
@mysql_fetch_array($result,MYSQL_ASSOC);

这个注意使用乱用,MYSQL_ASSOC,MYSQL_NUM 和 MYSQL_BOTH是一个enum吧。默认的是MYSQL_BOTH.

mysql的语句,如果执行in 的话不再支持limit。so...很麻烦。

支持distinct,group之,程序循环执行,md。

if(get_magic_quotes_gpc()){

$_GET=        stripslashes_gpc($_GET);

$_POST=    stripslashes_gpc($_POST);

$_COOKIE=    stripslashes_gpc($_COOKIE);

}
set_magic_quotes_runtime(0);#magic_quotes_runtime

function stripslashes_gpc($array) {

while (list($key,$value) = each($array)) {

if (is_string($value)) {

$array[$key] = addslashes(stripslashes($value));

} else if (is_array($value))  {

 $array[$key] = stripslashes_gpc($value);
 
}

}

return $array;

}

/**

* 处理程序中出现的错误
 
* @Date:2006-10-9-10:51
 
* @param    (类型)     (参数名)    (描述)
 
*/
function Error_Handler($errno,$errstr,$errorfile,$errline,$errtext){

echo(‘系统发生错误:‘.$errstr);

echo(‘At‘.$errorfile.‘的第‘.$errline.‘行.‘);
   
if($errno==E_USER_ERROR){

 echo(‘致命错误,程序已经中止‘);
 
}

}

在使用的时候:

set_error_handler(‘Error_Handler‘);

trigger_error(‘call trigger_error‘,E_USER_ERROR);

这是使用函数获取的,当然您的错误报告级别应该高点:

error_reporting(1048);

为了更加oo,先看看一个描述类的自写的函数:

$classname=‘Exception‘;

/**

* (功能描述)
 
* @Date:

* @param    (类型)     (参数名)    (描述)

*/

function ClassDetail($classname){

if(!class_exists($classname)){

echo($classname.‘类不存在‘);
  
}else{

print_r("以下描述类".$classname);

print_r("所有的方法<pre>");

print_r(get_class_methods($classname));

print_r("</pre>");
 
print_r("<hr/>所有的属性<pre>");

print_r(get_class_vars($classname));

print_r("</pre><hr/>");

}

}

ClassDetail($classname);

发现exception类的所有get方法是:

[0] => __construct

[1] => getMessage

[2] => getCode

[3] => getFile
   
[4] => getLine

[5] => getTrace

[6] => getTraceAsString

[7] => __toString

慢慢的优化个性点,也可以的。

{[csc:pagelist]}

ok,来看比较oo的处理方式:

class ErrorHandlers extends Exception{

private $_context = null;

function __construct($level, $string, $file, $line, $context=null){

parent::__construct($string,$level);

$this->file = $file;

$this->line = $line;

$this->_level = $level;

$this->_context = $context;

}

function __destruct(){

// parent::__destruct();

}

function Message(){

$errors = array(

E_ERROR => ‘error‘,

E_WARNING => ‘warning‘,

E_PARSE => ‘parsing error‘,

E_NOTICE => ‘notice‘,

E_CORE_ERROR => ‘core error‘,

E_CORE_WARNING => ‘core warning‘,

E_COMPILE_ERROR => ‘compile error‘,

E_COMPILE_WARNING => ‘compile warning‘,

E_USER_ERROR => ‘user error‘,

E_USER_WARNING => ‘user warning‘,

E_USER_NOTICE => ‘user notice‘

);

$str = $errors[parent::getCode()].‘: ‘.parent::getMessage().‘ 在 ‘.parent::getFile().

‘ 的第 ‘.parent::getLine()."行\n" ;

if($this->_level==E_USER_ERROR){

$str .= (‘


 

致命错误‘);

 

}

echo(‘

‘);

 

echo($str);

echo(‘

‘);

 

}

}

function error_handler($errno,$errstr,$errorfile,$errline,$errtext){

throw new ErrorHandlers($errno,$errstr,$errorfile,$errline,$errtext);

}

function exception_handler(Exception $e)

{

$errors = array(

E_ERROR => ‘error‘,

E_WARNING => ‘warning‘,

E_PARSE => ‘parsing error‘,

E_NOTICE => ‘notice‘,

E_CORE_ERROR => ‘core error‘,

E_CORE_WARNING => ‘core warning‘,

E_COMPILE_ERROR => ‘compile error‘,

E_COMPILE_WARNING => ‘compile warning‘,

E_USER_ERROR => ‘user error‘,

E_USER_WARNING => ‘user warning‘,

E_USER_NOTICE => ‘user notice‘);

echo $errors[$e->getCode()].‘: ‘.$e->getMessage().‘ in ‘.$e->getFile().

‘ on line ‘.$e->getLine()."\n";

echo $e->getTraceAsString();

}

trigger_error(‘5do8‘);

try{

$i = 1/0;

} catch(ErrorHandlers $e) {

echo "发生错误."; //可以输出错误行

$e->Message();

}

而后,注意了,如果您第一次(或者重新)加载的话,就加上:

set_error_handler(‘error_handler‘);

set_exception_handler(‘exception_handler‘);

如果不是上述情况,就不要加了,否则会出现

Exception thrown without a stack frame in Unknown on line 0

因为error_handler是anto_flush的。

在一个exception里面不能调用其他的exception。有2条普遍适用的规则,如下:

1:不要在一个Exception里面执行另一个Exception

2:不要在析构函数里面执行Exception.

restore_exception_handler();是可以保存exception柄的,注意,执行error以后就会有Exception的了。

最后,加上一个完整的例子:CallError.php

 

error_reporting(1048);

class ErrorHandlers extends Exception{

private $_context = null;

function __construct($level, $string, $file, $line, $context=null){

parent::__construct($string,$level);

$this->file = $file;

$this->line = $line;

$this->_level = $level;

$this->_context = $context;

}

function __destruct(){

// parent::__destruct();

}

function Message(){

$errors = array(

E_ERROR => ‘error‘,

E_WARNING => ‘warning‘,

E_PARSE => ‘parsing error‘,

E_NOTICE => ‘notice‘,

E_CORE_ERROR => ‘core error‘,

E_CORE_WARNING => ‘core warning‘,

E_COMPILE_ERROR => ‘compile error‘,

E_COMPILE_WARNING => ‘compile warning‘,

E_USER_ERROR => ‘user error‘,

E_USER_WARNING => ‘user warning‘,

E_USER_NOTICE => ‘user notice‘

);

$str = $errors[parent::getCode()].‘: ‘.parent::getMessage().‘ 在 ‘.parent::getFile().

‘ 的第 ‘.parent::getLine()."行\n" ;

if($this->_level==E_USER_ERROR){

$str .= (‘


 

致命错误‘);

 

}

echo(‘

‘);

 

echo($str);

echo(‘

‘);

 

}

}

function error_handler($errno,$errstr,$errorfile,$errline,$errtext){

throw new ErrorHandlers($errno,$errstr,$errorfile,$errline,$errtext);

}

function exception_handler(Exception $e)

{

$errors = array(

E_ERROR => ‘error‘,

E_WARNING => ‘warning‘,

E_PARSE => ‘parsing error‘,

E_NOTICE => ‘notice‘,

E_CORE_ERROR => ‘core error‘,

E_CORE_WARNING => ‘core warning‘,

E_COMPILE_ERROR => ‘compile error‘,

E_COMPILE_WARNING => ‘compile warning‘,

E_USER_ERROR => ‘user error‘,

E_USER_WARNING => ‘user warning‘,

E_USER_NOTICE => ‘user notice‘);

echo $errors[$e->getCode()].‘: ‘.$e->getMessage().‘在‘.$e->getFile().

‘的第‘.$e->getLine()."行\n";

echo $e->getMessage();

die();

}

//

set_error_handler(‘error_handler‘);

//restore_error_handler();

set_exception_handler(‘exception_handler‘);

//restore_exception_handler();

我肯定是错误

?>

执行结果:

notice: Use of undefined constant 我肯定是错误 - assumed ‘我肯定是错误‘在E:\web\web\php\bi\exception\m.php的第74行 Use of undefined constant 我肯定是错误 - assumed ‘我肯定是错误‘

 

另外,在类中,还可以这样:

function trigger_error($error_msg, $error_type = E_USER_WARNING)

{

trigger_error(" error: $error_msg", $error_type);

}

著名的Smarty就是这么做的.


站长资讯网 做中国最丰富的资讯网站 沪ICP备05004089号