PHP中的错误处理方式 有 die(),exit(),@,error_reporting,set_error_handler
首先前2个函数一般不会使用,使用时往往不是发生了程序错误,而是发生了权限错误
<?php //一般mvc中为了防止通过直线式访问文件而不是通过mvc url映射访问,需要在配置文件定义一个全局常量,比如BASE_PATH //该变量一般放在入口文件或者配置文件中,为了提高安全性,往往会这样做 defined(BASE_PATH) or die('no access premisson'); //defined(BASE_PATH) or exit('no access premisson'); .... ?>
至于@符号 ,是一种极其愚蠢的方式,如果调试程序还可以原谅,但正式产品出现@程序的问题往往后更加严重,因此一般需要通过兼容的方法防止使用 @,比如下面获得来自客户端 GET方式的参数
<?php $test_param = @$_GET['param'];//在新版php中,当param未被传递时,很容易造成程序终止,而且发生错误也无法找到位置 $test_param2 = isset($_GET['param'])?$_GET['param']:'';//推荐使用这中方式,如果觉得程序太长,不妨写一个函数 if(function_exists(get)) { function get($request_name){ return isset($_GET['param'])?$_GET['param']:''; } } $test_param2 = get($request_name); ?>
好了,言归正传
php中的error_reporting用于设置错误相应级别
主要级别有 E_ALL,E_ERROR,E_WARNING,E_NOTICE,E_PARSE,....
使用方式如下
<?php //禁用错误报告 error_reporting(0); //报告运行时错误 error_reporting(E_ERROR | E_WARNING | E_PARSE); //报告所有错误 error_reporting(E_ALL); //除去提醒处理 error_reporting(E_ALL~E_NOTICE); ?>
<?php function myErrorHandler($errno, $errstr, $errfile, $errline) { if (!(error_reporting() & $errno)) { //判断该错误级别是否已被包含 在其中 return; } switch ($errno) { case E_USER_ERROR: echo "<b>My ERROR</b> [$errno] $errstr<br />\n"; echo " Fatal error on line $errline in file $errfile"; echo ", PHP " . PHP_VERSION . " (" . PHP_OS . ")<br />\n"; echo "Aborting...<br />\n"; exit(1); break; case E_USER_WARNING: echo "<b>My WARNING</b> [$errno] $errstr<br />\n"; break; case E_USER_NOTICE: echo "<b>My NOTICE</b> [$errno] $errstr<br />\n"; break; default: echo "Unknown error type: [$errno] $errstr<br />\n"; break; } /* Don't execute PHP internal error handler */ return true; } function scale_by_log($vect, $scale) { if (!is_numeric($scale) || $scale <= 0) { //使用trigger来触发异常 trigger_error("log(x) for x <= 0 is undefined, you used: scale = $scale", E_USER_ERROR); } if (!is_array($vect)) { trigger_error("Incorrect input vector, array of values expected", E_USER_WARNING); return null; } $temp = array(); foreach($vect as $pos => $value) { if (!is_numeric($value)) { trigger_error("Value at position $pos is not a number, using 0 (zero)", E_USER_NOTICE); $value = 0; } $temp[$pos] = log($scale) * $value; } return $temp; } $old_error_handler = set_error_handler("myErrorHandler"); ?>
好了,这样设置来自定义处理自己的错误,读者可以制作一个php日志系统或,来记录错误日志哦
----------------------------------------------------------------------------------------------------------------------
当然有错误处理,必然有异常处理
<?php function exception_handler($exception) { echo "Nicht aufgefangene Exception: " , $exception->getMessage(), "\n"; } set_exception_handler('exception_handler'); //在这里主动抛出异常,(在这里说一下,php正常开发中最好不要主动抛出异常) throw new Exception('Nicht aufgefangene Exception'); echo "Nicht ausgeführt.\n"; ?>
--------------------------------------------------------------------------------------------------------------------------
当然以上2种错误处理的方式中,使用的是函数,但在一些软件中,也会使用到类对象
<?php class ErrorExceptionHandle { public static function errorHandle($errno, $errstr, $errfile, $errline) { ...... } public static function exceptionHandle($e) { ..... } } set_error_handler(array('ErrorExceptionHandle',"myErrorHandler")); set_exception_handler(array('ErrorExceptionHandle','exception_handler')); ?>
当然,php也有类似java的异常处理方式,也可以使用,但是set_exception_handler是具有全局性的,因此推荐使用
不过也看一下其他方式吧
<?php try{ //..... } catch(Exception $e) { var_dump($e); } ?>