手机浏览 RSS 2.0 订阅 膘叔的简单人生 , 腾讯云RDS购买 | 超便宜的Vultr , 注册 | 登陆
浏览模式: 标准 | 列表分类:PHP

PHP分段屏蔽错误(异常)的方法

本文来自lukin的博客。。。
Lukin,lazyCMS的作者,如果你用过,或许会知道。。。

以下是原文

我是从asp转向php的,asp里面提供了下面的方法

代码1:

ASP/Visual Basic代码
  1. on error remuse next  
  2. '这里的代码出现的错误可以被屏蔽掉  
  3. on error goto 0  
----------------------------------------------------华丽的分割线-------------------------------------------------

转向php之后,查了一些资料貌似php没有提供类似这样的语法

直接使用error_reporting(0);关闭所有错误是很不明智的。所以,考虑使用@来抑制错误的发生,但是往往不如意。

我使用的set_error_handler('myerror')监听了一个函数,直接写@抑制错误的发生那是办不到的,照样会跳到myerror函数里面进行处理,后来看WordPress的源码,发现她屏蔽错误的方法:

代码2:

PHP代码
  1. $error_reporting = error_reporting(0);  
  2. // 这里发生的错误将被屏蔽  
  3. error_reporting($error_reporting); 

应用到我系统里面,发现此方法也不好用,照样会进入myerror函数进行错误处理。

继续狂翻php手册,仔细查看set_error_handler这个函数的说明,然后查看评论(一般看手册上的评论还是很有收获的),评论上的一段代码引起了我的注意:

代码3:

PHP代码
  1. // if error has been supressed with an @  
  2. if (error_reporting() == 0) {  
  3.    return;  

细想了一下,把这段代码加入到myerror里面,果然ok了!原来使用@的时候,error_reporting()会返回0

这样可以利用@屏蔽某个函数里面发生的错误了,也可以使用【代码2】的方法来进行分段屏蔽错误了。

--EOF--

我一般是用Set_error_handler的。。还有我记得Error_reporting是可以返回当前设置的等级的。先取回当前的等级,然后设置为0,解决完后再设置回去。其实也是就第二种了。。不过我觉得lukin应该是用这种的,即:

PHP代码
  1. <?php  
  2. $old = error_reporting();  
  3. error_reporting(0);  
  4. //code....  
  5. error_reporting($old);//恢复。。  


让我郁闷的THinkSNS权限管理

使用ThinkSNS进行管理里。发现后台可以对用户组进行权限设定。于是乎,设定了一些菜单的权限。而且设定功能感觉也很强劲,因为可以设定子菜单是否可以访问呢。然而让人郁闷的却是,系统根本没有调用过这些权限。也就是说,你全部白设定了。
靠。太让人郁闷了。没完成你别放出来嘛。。。心都凉了。

顺便再说一个小BUG,UserSearch里如果要加入新的元素,你必须是这个元素为4个值的数组,即下标从0~4,如果ONLY第2个元素,你根本插不进数据库。【不多解释,如果增加内容到UserSearch里的人一定会注意到这个小BUG。。。。】

thinkSNS 一些BUG列表

thinkSNS在最近的一段时间开发中,发现了不少BUG。。。没办法,谁让要用他的呢?

1、blog删除后跳转代码为redirect('index'),i应该大写,否则会报页面不存在的错误。
2、一些widget放在<inlucde footer>[<-左侧是伪代码]后面,导致有时候不能解析。好奇怪。。。有时候能够解析。
3、后台权限管理不正常,明明只选了一些简单的权限,但却多了一些不该有的权限。【准备改了,个人站点应该遇不到。毕竟就一个管理员】
4、如果后台把游客查看博客的权限打开,在前台反而会出错,因为博客页有评论,而读取评论列表时需要登录 。

其他一些未知BUG随着开发会越来越多。。有时候发现,thinksns作者是不是有点太粗心了?

不过。期望能够看到小游戏插件。黑黑,对分数排名很喜欢。

尝试开放labs.neatcn.com

这是一个尝试,其实在我的域名下已经有很多这样的实验性的代码了。不过都没有一一公布而己。

当然页面还没有做,提供的接口也仅仅是FOR PHPRPC的。【不是不想用hprose,实在没钱】

慢慢来吧。准备找个漂亮的页面抠回来写文档。呵呵

随记而己

 

ucapi注意:uc_feed_get函数的参数

discuz的几乎所有程序都有一个:加入事件,那么,其他平台怎么获取这个事件呢?那就是uc_feed_get方法了。但 事实上,有很多人都没有注意过这个方法有第二个参数。

如果你直接去uc的uc_feed表查看,你会经常性的发现这个表是空的。而autoIndex却很大,这又是为什么呢?

于是打开uc_client方法,却发现这个函数有两个参数,第一个参数是一次获取的条数,第二个参数是Delete,默认值为true,也就是说,获取完多少条后,他都会自动删除。因此uc_feed表就几乎是永远空着了。

但问题也就在这里。我怎么知道是哪个系统获取了这些feed呢?A系统获取Feed后,B是不是也获取到了呢。又怎么处理的呢?没有仔细看代码。。。

文档中uc_feed_get只提供了一个参数limit,可以查看:http://www.ucapi.com/api/feed.htm

建议在开发的时候,先找一个uc_feed_get方法。自己写程序处理。否则,应该会出现a系统有Feed,B系统没有Feed的情况。【慎重,主要还是没有队列。。。或者推送机制,否则在有了feed后,同步向各个系统推送一下Feed呢?不就结束了?】

uchome的UC接口中有一个addfeed方法,理论上是应该在其他系统添加后往uc.php推送的。只是没有看到哪里有推送代码。。。难道是放在事件中?迷惘了。