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);
}
?>