PHP错误和异常处理函数

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

?>



转载于:https://my.oschina.net/ososchina/blog/337516

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值