文档章节

PHP错误和异常处理函数

IamOkay
 IamOkay
发布于 2014/10/26 20:09
字数 832
阅读 756
收藏 0

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

?>



© 著作权归作者所有

IamOkay

IamOkay

粉丝 198
博文 483
码字总数 403041
作品 0
海淀
程序员
私信 提问
PHP错误和异常详解(PHP7错误处理)

世界上没有绝对完美的事,对于程序员来说更是如此,无论我们多么努力、多么细心的开发一个项目,总会有缺陷和错误的存在。 错误和异常的异同 "错误"和"异常"的概念十分相似,很容易混淆,"错...

charley158
2018/03/30
0
0
贝尔的技术博客 cnbeir@163.com PHP中的错误处理、异常处理机制

在编写php程序时,错误处理是一个重要的部分。如果程序中缺少错误检测代码,那么看上去很不专业,也为安全风险敞开了大门 例: <?php $a = fopen('test.txt','r'); //这里并没有对文件进行判...

雍雍_yoyo
2013/01/31
0
0
说说接口封装

今天给同事封装了一个接口,说起接口封装的事情,其实其实很有的聊。很多时候,说一个服务好,一个服务烂,实际上都是在吐槽服务队外暴露的接口好坏。不管什么语言,封装接口,抽象起来,就是...

王二狗子11
2018/01/07
0
1
PHP 的异常处理、错误的抛出及错误回调函数

一、错误、异常 等级常量表 error:不能在编译期发现的运行期错误,不如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断; exception:程序执行过程中...

欣儿
2013/11/18
0
0
PHP中register_shutdown_function函数

函数说明 定义:该函数是来注册一个会在PHP中止时执行的函数 参数说明: 注册一个 callback ,它会在脚本执行完成或者 exit() 后被调用。 callback:待注册的中止回调 parameter:可以通过传...

Ocean_K
04/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

4.01、Linux异常

1、无法连接虚拟设备ide1:0,因为主机上没有响应的设备 解决方法:找到“虚拟机” —— 打开“虚拟机设置” —— 单击“CD/DVD(IDE)”,右侧选中“使用ISO映像文件”,然后选中自己的镜像,重启...

静以修身2025
27分钟前
1
0
不允许有匹配 "[xX][mM][lL]" 的处理指令目标

Bug解决方案:org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 8; 不允许有匹配 "[xX][mM][lL]" 的处理指令目标 Caused by: org.xml.sax.SAXParseException; lineNumber: 1; c......

我叫小糖主
30分钟前
1
0
Mysql InnoDB 行锁和表锁介绍

mysql 的 InnoDB引擎支持行锁,与Oracle不同,mysql的行锁是通过索引加载的,即是行锁是加在索引响应的行上的,要是对应的SQL语句没有走索引,则会全表扫描,行锁则无法实现,取而代之的是表...

嘴角轻扬30
31分钟前
2
0
springboot+jpa 错误信息org.springframework.beans.factory.BeanCreationException

报错信息 org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/a......

冥焱
48分钟前
1
0
威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟

近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙。我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名。 Xulu并不是第一个攻击...

迷你芊宝宝
55分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部