jpgraph类库如何进行错误处理

网络整理 - 08-04
在jpgraph教程中我已介绍了jpgraph在php环境中的安装配置教程、jpgraph字体安装配置教程以及jpgraph创建图形实例教程等,接下来我们来说说关于错误处理的问题,编写php代码遇到错误不可避免,关键是如何针对错误进行处理,jpgraph作为基于PHP5的类库,其可以使用PHP5的异常处理机制,下面来介绍下jpgraph类库关于错误信息处理方面的概念以及在遇到jpgraph脚本错误时应该如何处理。

  jpgraph类库错误处理介绍

  错误信息和图像问题

  为何要说错误处理呢?因为图像的生成脚本需要一个相比正常错误信息稍微不同的错误处理方式。为了看到其复杂性需要考虑如何调用一个jpgraph脚本。通常jpgraph脚本是通过<img>标签调用的。这意味着游览器预计图像数据是通过jpgraph脚本发送的。如果我们改为发送文本错误信息,游览器将不能显示任何信息。

  处理jpgraph类库正常生成图像时的错误信息。一个典型的错误信息如下

jpgraph错误信息实例

  这里有一个规则例外,即header already sent错误信息的情况。这意味着客户端已经接收到了一个确定性的头部信息,即文本头。因此在这种情况下发送图像没有意义,只有错误信息是作为正常的text/html类型的消息发送的。

  一个典型的在游览器中错误信息如何显示的例子如下(中文游览器可能错误信息不通,情况其实是一样的)

jpgraph头部信息已发送错误实例

  当你获得这个错误信息请关注图中红色信息,其会告诉你在什么文件哪一行开始有错误输出。在大多数情况下是一个空格或制表符造成的。也可能是在一个文件的末尾有多个换行符造成的。由于这些错误很难被发现,所以在编辑器中编辑时需要格外小心。

  创建图像时系统部分的缓存错误

  在之前部分描述的问题同样也会在PHP中产生错误信息。需要明白在php jpgraph开发期间任何潜在的错误信息可能需要指示类库拦截PHP错误信息而不是将其转换为图像信息。这都是通过控制jpg-config.inc.php配置文件中定义的选项INSTALL_PHP_ERR_HANDLER和CATCH_PHPERR选项来实现。

  INSTALL_PHP_ERR_HANDLER

  设定此选项为true则将会让jpgraph类库安装常用的错误处理器,其会捕捉所有PHP错误信息并且将其转换为之前6.1所示的图片。选项默认是禁用的。

  CATCH_PHPERR

  此选项控制类库是否应检查存储在全局PHP预定义变量php_errmsg中任何生成的错误消息。如果在调用jpgraph脚本时发生错误,这在开发时非常有用。此错误会显示为图片。默认是启用的。所有jpgraph类库产生的错误信息都已在附录H中列出(可在英文版中找到)。

  本地化错误信息

  jpgraph类库包含两种本地化错误。在2.5版本中类库支持英文和德文错误信息。选择使用哪种本地化错误信息可以有两种方法:通过jpg-config.inc.php配置文件中的专门的全局变量定义或在2.5版本中有三种本地化选项:en、de、prod。

  为了指定本地化错误信息需要在jpg-config.inc.php配置文件中设定

1

define('DEFAULT_ERR_LOCALE','en');

  除此之外,也可以通过调用静态方法JpGraphErr::SetErrLocale($aLocaleString)动态设定本地化错误信息。比如,为了动态改变为德文本地化错误信息,需要这样调用

1
2
3


?>

  jpgraph错误信息本地化注意事项:这里有个潜在的问题是动态指定的语言环境。由于脚本动态调用本地化错误信息发生在某一个点,这意味着,如果错误发生在变化发生之前,将使用jpg-config.inc.php配置文件中默认的本地化错误信息配置。

  产品服务器上的错误信息

  在产品服务器上通常不会显示专门的错误信息以公开那些潜在的安全问题。为此,会有一个伪的错误信息。这适用于已设定本地化错误信息选项为prod的情况。如果有错误信息产生将会以错误代码形式代替。此错误代码信息将会传递给开发团队以便将来调查。典型的prod本地化错误信息实例如下

jpgraph产品服务器上的错误信息实例

  在附录H中有相对应的问题代号

  通过改变lang/prod.inc.php文件中的实际文本可定制production错误信息

  使用PHP异常抛出处理

  自jpgraph版本2.5开始全部支持PHP5形式的异常抛出处理。jpgraph类库提供了一个JpGraphException异常处理类,相比传统的异常类略有不同,其不仅作为错误返回文本字符串也返回一个image。为了处理脚本错误这是必须的,并且会内部调用一个<img>标签。在游览器中能够显示的唯一数据就是图像数据,因此将错误格式化为一个图像是非常必要的。

  除了提供一个异常处理类,jpgraph类库也安装了其自身默认的异常处理程序来正确显示图像。默认的异常处理程序会自动调用无论何时一个未捕获的异常产生时。这意味着没有必要在脚本中必须使用try{}catch(){}

  当一个异常产生时,默认的异常处理程序首先验证此异常是否是JpGraphException的后裔,如果是,则调用JpgraphException::Stroke()方法生成图片。如果异常不是JpGraphException的基本异常,则重新引发错误。这意味着,你创建的脚本需要从内部调用一个<img>标签,同时所有异常应该为了产生一个错误图片而衍生一个JpGraphException异常。

  典型的抛出jpgraph exception的实例代码

1
2
3


?>

  万一你需要处理异常比如做必要的清理,务必记住调用Stroke()方法,其会创建一个错误信息流返回至游览器。捕获jpgraph异常并将其以图片形式返回游览器的例子如下

1
2
3
4
5
6
7
8
9
10
11
12

Graph

throw


}
?>

  提示:另一个典型的异常处理的方法是将错误信息记录到日志服务器或文本格式的日志文件中。这需要在调用Stroke()方法之前操作。

  文本和图像基础错误处理间的选择

  在之前的部分中已介绍默认异常发生时jpgraph类库会创建一个错误图像来显示错误。但是在一些情况下基于文本的错误处理是首选(通常是命令行方式创建图形)。

  这可以通过两种方法完成​​。一是通过在脚本中捕获异常,并进行相应的处理或可以稍微修改jpgraph类库中的默认异常处理程序的默认行为。方法如下

  为了启用基于文本的错误处理程序,我们只需要禁用基于图像的错误处理程序。这通过调用JpGraphError::SetImageFlag($aFlag)方法实现,即

1
2
3


?>

  当通过命令行方式调用脚本时,将上述语句添加到jpgraph脚本中会导致任何错误都打印到STDERR中。当使用的命令行结构如

1

$> php mygraph.php > mygraph.png

时这是一个非常方便的显示错误的方法。因为写入错误至STDOUT将会导致错误信息返回至控制台(上述调用仅仅只是重定向至STDOUT而不是STDERR)。

  当脚本是在一个绑定PHP的HTTP服务器(比如apache)上调用时,由于没有STDERR,错误信息将会以普通文本的方式送回游览器。

  将错误信息写入日志文件或系统日志中

  除此之外,也可以将jpgraph错误信息写入一个已命名的日志文件中。日志文件名必须通过调用静态方法JpGraphError::SetLogFile($aFileName)指定。该文件需要PHP进程是可写的。所有错误消息被追加到文件的末尾,每个错误消息是有前缀的日期和时间(RFC 2822格式的日期)。如果文件名给定的是syslog字符串,则所有错误信息将会写入默认的系统日志中,比如apache在Unix上一般是/var/log/apache2/error_log。

  添加新的本地化错误信息

  所有错误信息都存储在一个具有特定索引,不能更改的数组中。该索引被jpgraph类库用来引用一个特定的错误消息的。

  创建一个本地化的错误源文件,首先你需要复制en.inc.php文件到一个临时文件中,然后根据你正在创建的的本地化错误信息重命名,比如中文错误信息。通过翻译每一个错误信息来实现。确保此文件存储在jpgraph/lang/目录下同时新的本地化错误信息可用。

  比如你需要创建中文版本,则首先需要将lang/en.inc.php中的内容复制到lang/cn.inc.php中,然后翻译这些错误信息。在可以使用中文时在SettErrLocale()方法中使用cn字符串即可。

  至此,php jpgraph类库错误信息的概念以及如何对jpgraph异常错误进行处理的教程就介绍完了。翻译得不好还请见谅。