细看PEAR的错误处理

leningkeji

leningkeji

2016-01-29 13:43

细看PEAR的错误处理,细看PEAR的错误处理

PEAR提供了强大的错误处理机制。这篇文章向你展示如何从这个系统中获益。


许多程序已经使用了PEAR的包。许多PHP程序员或多或少的熟悉了PEAR中的错误处理。但是这个机制并不局限于PEAR的包所有人都能在他们的类和程序中使用这些方法。

这篇文章被分为两个部分:首先我们将看看类中用于错误处理的函数,然后我们将看看如何基于PEAR错误处理机制来处理错误。

我们的例子类称为cvs2db,它把数据从CSV文件插入到数据库的表中。因为数据可能是手写的,他们的数据应该在插入之前先得到验证落实postcode。函数import()完成读入,检查和插入的工作;它返回损坏的记录数目。如果返回的值大于0,出错的记录集能够使用exportUnvalid()写入到新的CSV文件中。典型的用法是这样的:

<?php$cd = new csv2db();$dsn = 'mysql://root@localhost/csv2db';if( 0 < $cd-import("./dat.csv", $dsn, 'address')) {$cd-exportUnvalid("./dat2.csv");}?


可能的错误包括:

要导入的CSV文件不存在,
连接到数据库失败,
记录集损坏,以及CSV导出文件无法创建。

在提供错误信息的经典解决方案中你可能写这样的代码:

<?php$cd = new csv2db();$dsn = 'mysql://root@localhost/csv2db';$result = $cd-import("./dat.csv", $dsn, 'address')switch($result) {case FILE_NOT_OPENED:...break;case DATABASE_ERROR:...break;default:if(0 < $result) {$cd-exportUnvalid("./dat2.csv");} else {echo 'every thing ok!'}}?


这对于短的脚本来说是可接受的也是常用的办法但是对于错误处理经常受到关注的大程序来说不是这样。传统的可能性强迫类的作者做最终的决定!在大部分情况下,这个决定根据的是那时对类的调用而不是基于长期的使用和可重用代码的思想。一个灵活的错误处理机制是可重用代码的重要部分,PEAR Error API 就是这样的一种受到良好测试的机制。


用户眼中的类

除了那两个函数之外,类提供了一套错误处理函数和一个自己的错误对象称为DB2CVS_Error,它有一个特殊的本地化的错误信息的特性功能。

现在我将向你展示如何在错误发生时控制类的行为。

局部和全局错误处理

你用setErrorHandling()管理错误处理;这个函数需要两个参数:第一个是错误模式,而第二个(可选的)参数是错误模式特定的选项。例如 setErrorHandling(PEAR_ERROR_PRINT, 'This error occurred %s') 还有 setErrorHandling(PEAR_ERROR_TRIGGER, E_USER_WARNING)。


这个函数的调用方式是一般行为中最重要的:静态还是实体。在类cvs2db中,我们能两者都用来设置错误处理,所有这些调用有相同的结构为类设置错误模式:

// per instance$cd = new csv2db();$cd-setErrorHandling(PEAR_ERROR_DIE):// staticCVS2DB::setErrorHandling(PEAR_ERROR_DIE);PEAR::setErrorHandling(PEAR_ERROR_DIE);


如果两者给出同样的结果,区别在哪?实体调用仅仅为那个类设置而静态调用对于所有使用PEAR_Error或者从那个类派生的所有类起作用。这个也作用于第一个静态命令CVS2DB::setErrorHandling(PEAR_ERROR_DIE)虽然它看上去仅仅影响了cvs2db类。


总结:作为一个实体函数使用命令意味着仅仅为这个实体(局部)设置错误模式,而作为静态函数来调用就是为整个脚本设置错误模式(全局)。


setErrorHandling() 和 raiseError()


两个函数都能够被静态调用和作为实体的函数调用。记住怎样的一个组合使得他们如何互相影响的很重要。

基本上是:setErrorHandling()的静态调用仅仅影响raiseError()的静态调用setErrorHandling()作为实体函数仅仅影响raiseError()作为静态函数调用。在类csv2db中,使用csv2db::setErrorHandling()来设置错误模式是不可行的,因为我们使用$this-raiseError(...)。解决这个闻天有一点小技巧改写raiseError():

function raiseError(...,$mode=null, $options=null,...) {if($mode==null && $this-_default_error_mode!=null) {$mode = $this-_default_error_mode;$options = $this-_default_error_options;}return PEAR::raiseError(...,$mode, $options,...);}


这样,我们映射实体调用到静态上,如果你用错误模式调用raiseError(),然后这个模式将会覆盖这些设置这里是指的
展开更多 50%)
分享

猜你喜欢

细看PEAR的错误处理

PHP
细看PEAR的错误处理

ASP错误处理

ASP
ASP错误处理

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

ASP的错误处理集锦

ASP
ASP的错误处理集锦

使用PHP的错误处理

PHP
使用PHP的错误处理

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

Javascript学习笔记:错误处理

Web开发
Javascript学习笔记:错误处理

MySQL 错误处理例子[译]

编程语言 网络编程
MySQL 错误处理例子[译]

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

搜索引擎技术核心揭密(PHP)

搜索引擎技术核心揭密(PHP)

用PHP调用Lucene包来实现全文检索

用PHP调用Lucene包来实现全文检索
下拉加载更多内容 ↓