这样的错误处理方式绝对不能接受!使用这样的代码将会惹恼用户、激怒老板,如果CEO 收到大客户谴责的邮件,可能会惹火身边那些不得不加班查问题的人。
首先,实际上您已经编写了错误处理代码。不精确地讲,包含println()语句的catch块可以被认为是错误处理,这是一个非常拙劣的方法。错误处理代码不仅仅是一个错误报告—高质量的错误处理应该是:
∙用户友好性。
∙无中断(除非必须如此)。
∙具有告知性。
错误处理是用户友好的
最重要的是,错误处理代码针对的是应用程序的用户。实际上,程序最终都是为用户服务的。甚至您自己的调试语句都可以帮助您了解发生的问题,这样就可以修复功能。功能是为用户服务的。错误处理代码同样也是。
当然,“用户” 这个词可以具有多种不同的含义,尤其是如果不编写面向用户的代码的话。如果您的应
java xml是什么用系统是在公司和银行之间传输财务数据的后端系统,那么,您的用户可能是一些公司的内部部门或银行。如果代码仅仅是供另外一个部门使用的基础代码,那么,这个部门就是您的用户。所以,首先要确定的是,谁是您的用户?
一旦确定您的客户是新泽西州的电脑用户,还是三楼的Web 开发人员,或是纽约证券交易所的主席,就可以编写对那些用户(或用户类)友好的代码。对于消费者,需要提供不涉及编程术语的、易读的错误消息;对于网站开发人员,需要提供本部门或系统管理小组的;对于银行的CEO,错误处理最好不要中断他们的工作。实际上,在过多考虑错误消息之前,最好认识到并不是所有的错误处理代码都必须报告错误。
错误处理是不中断的(除非必须如此)
如果在您开车上班的路上,遇到一个大型的施工项目阻塞了交通,您不用把车靠到路边,熄火,在心里思考如何修饰自己的简历,因为您担心这次迟到而被解雇。这是很愚蠢的。您可以到下一个出口并确定备用路线。这也许会花去一些额外的时间,甚至要打电话告知某人您将不能按时参加早上8 点的会议。但是尽管受到施工问题的影响,您仍然到了解决方法。
最好的错误处理方式和您遇到问题的情况完全相同:试图到避开问题的方法。程序中断,并弹出“对不起,您运气不好” 的消息或打印出堆栈跟踪,这不是错误处理,而是错误报告。作为程序员,您要做
的是即使有问题存在,也要全力保证用户正常工作。
在XML 的世界中,这意味着获取那些可能产生错误的数据并对其进行处理。有时,实际上您能够忽略某些低级的错误,或保证不使整个程序崩溃的前提下,将消息写入一个文件。而有时您可能需要向程序用户(可以是另一个程序而不是人类用户)请求更多或替代信息。在这些情况中,设法维持并继续处理。
只有真正出现灾难的情况下才可以完全中断用户的工作。如果一个文件完全丢失了,数据已经篡改而无法修复,或在XML 文档中缺少必需元素,这时可以中断用户的工作。这就好比 4 或 5 条路被洪水淹没,小路也被完全淹没的情况。换句话说,除非遇到真正的灾难,否则不要完全中断。
这就是SAX 的真正用途所在:在程序中断处理过程并进行修复之前,允许接收可能错误的数据或者错误状态。
错误处理要具有告知性
当错误发生时,无论采取什么方法处理,都必须提供有用的信息。在最好的情况下,这个信息是程序的用户最初需要的、请求的或想要生成的。如果不能进行很好的恢复,而且必须改变处理过程,那么需要标明下一步要做什么。对于那些罕见的必须完全中断处理过程的情况,需要提供更加有用的信息。
但是关键问题是必须要了解您的用户。如果您的程序是一个通过其他处理组件调用的企业对企业(business-to-business)组件,日志文件的堆栈跟踪和技术性错误消息则非常有帮助。这为利用程序进行交互的程序员提供了详细信息。然而,如果您的程序是面向用户的Web 应用程序的一部分,您不能抛出堆栈跟踪和错误代码。相反,需要提供人类可读的(这与程序员易读性不同)消息以及与谁联系得到更多帮助的信息。如果这些信息您并不知道,那么确保抛出一个提供有用信息的异常,以便调用程序能够(但愿)做出类似的智能决策。
SAX 支持大多数的XML 处理
优秀的基于XML 的错误处理的关键问题在很大程度上与SAX 有关。并不是因为SAX 天生比其他API 有优势,也不是只有它适合错误处理— SAX 是关键要素,仅仅因为几乎所有的XML 处理都在一定程度上与SAX 有关。
原因很简单:SAX 得到广泛应用已有很长的时间,并在迅速传播。对XML 进行操作相当容易,但从很多方面来看,它并不是一种直观的语言。XML 有很多结构和奇怪的语法习惯,很难进行解析。对于多数的解析器和处理器供应商来说,构建一个自定义的解析器API 来处理XML(从文本数据到元素,再到名称空间、实体引用),这种想法完全不可取或者非常难以实现。这些供应商(甚至API 作者)转而使用SAX,因为SAX 表现相当优秀。— SAX 在很多方面并不擅长,但在XML 解析方面表现非常突出。因此,如
果了解了在SAX 中如何处理错误,那么就会学会如何在任意XML 处理API 中处理错误。
现在,了解一些SAX 基础知识(附有代码示例)。第一步是从您使用的处理API 转向使用SAX。
使用SAX 进行SAX 解析(显而易见)
如果您已经是一个SAX 老手,那么就不用再从头熟悉SAX,您已经使用过这个API 了。明确地说,您也许正编写与清单 1 相似的代码,使用SAX 解析XML 文档的程序的一个片段。
如果使用这样的代码,那么在XML 处理中就可以很好地处理错误。如果您已经了解如何通过SAX 或其他API 访问XMLReader实现,那么就朝着成功的错误处理迈进了第一大步。
DOM 一般也使用SAX
很多DOM 解析器实际上是SAX 解析器建立了一个DOM 树。DOM API 本身并不公开底层SAX 解析器,因为DOM API 主要是处理一个DOM 树,而不是生成树的结构。很多实现DOM 的解析器至少提
供一个供应商专用的方法来访问一个底层SAX 解析器。
例如,在Xerces 中,构建DOM 树的类称
为s.parsers.DOMParser。可以调用该对象的parse()方法,以Document对象的形式获得一个DOM 树,如清单 2 中的代码段所示。
乍一看,这与SAX 中的解析过程相似。实际上,InputSource类(将文档导入DOMParser实例的方法之一)是一个SAX 结构。但是更凑巧的是,如果打开Xerces-J API 文档或跟踪源代码,将会注意到DOMParser扩展了另外一个Xerces 类
s.framework.XMLParser。该类成为
了DOMParser和 Xerces 中的SAX 解析类SAXParser的基础。
以上的描述是令人困惑的,但是基本意思是:XML 解析的实现为Xerces-J 中的SAX 解析服务,也是DOM 解析类的基础。所以,虽然不能将DOMParser类追溯到SAX 的XMLReader,但支撑Xerces-J 的XMLReader实现的代码同样支持DOMParser。因此,有很多有价值的方法可用
于DOMParser:
∙setEntityResolver():该方法使用一个SAX 结构——EntityResolver,用来处理XML 文档中的实体。
∙setFeature():这是另外一个起源于SAX 的方法,允许设置解析器的与DOM 相关的和与SAX 相关的特性。
∙setErrorHandler():这是错误处理的关键方法。该方法接收一个
SAX ErrorHandler实现,允许截取和响应错误。
即使不能直接访问SAX XMLReader实现,也可获得一些与SAX 有关的方法,它们是本文中错误处理的核心方法。
JAXP 也采用SAX
很多开发人员不会笨到直接使用SAX 或DOM。他们使用JAXP API(Java API for XML Processing)。清单 3 中的代码段使用JAXP 进行SAX 解析。
接下来可以像处理一个简单SAX 应用程序一样处理XMLReader实例,并设置一个错误处理程序。
使用JAXP 进行DOM 解析时也同样如此,提供了一种更为简便的DOM 到SAX 的API 分层。清单 4 中的代码段说明了一般的DOM 解析过程。
虽然这是基于DOM 的解析,但是转换为SAX 非常容易。实际上,在考虑将代码由DOM 转换为SAX 之前,首先要考虑更基本的事实:如果使用JAXP,就已经获取SAX 类(参见清单3)。所以,如果使用JAXP,则不用考虑将DOM 转换为SAX 的问题(参考资料中列出的developerWorks 技巧提供了详细的说明)。只需要重写一些代码,使用SAXParser代替DOMBuilder即可,这样就可以开始添加与SAX 有关的错误处理了。
更高级的API(如JAXB)同样使用SAX
至此,应该可以得出一些SAX 广泛应用的结论。SAX 可用于DOM 处理、JAXP 解析。那么顺理成章地,使用DOM 的高层API 或模型JAXP 也能够使用SAX。当然对于这些API 需要做一些处理,但是可以从中得到一个基础的SAX。
另外一个满足该模式的流行API 是Sun 公司用于XML 绑定的Java API(JAXB)(或架构,取决于所使用的版本)。JAXB 允许将一个XML 文档转换为一个Java 对象模型,然后将对象模型再转换回XML。将XML 转换到Java 的过程叫做解组,可分为两步:
1. 解析XML 文档,保存文档中的数据、元素和属性的名称,以及元素、属性和数据之间的关系。
2. 将数据转换为成员变量和Java 对象模型的实例。
在解析的过程中,可能会产生错误,因此必然会用到SAX。JAXB 就是这样,并且会间接得到一个SAX XMLReader,清单5 展示如何获得用于解组的核心类Unmarshaller,并实现对基于SAX 的解析过程的细粒度控制。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论