作者: BUILDER.COM
按照Java语言的定义,所谓异常(Exception)指的就是向调用方法(calling method)表示发生非正常情况的习惯方式。本文讨论两种在处理异常时可兹利用的技术:异常嵌套和捕捉适当的异常。
异常嵌套
你在试图捕捉异常并打算扔出异常时该采取什么措施呢?同时,你希望原始的异常信息可用吗?
要回答以上的问题你不妨尝试一下NestedException类。具体的编程并不难,唯一要做的无非是利用构造器并且重载printStackTrace()以便显示出正确的数据。
此外,你还应当考虑封装Throwable而非Exception类来创建更具有重用性的组件。之后,你可以创建NestedRuntimeException变量封装Throwable但无需对其进行声明。清单A显示了完整的示例。
捕捉适当的异常
正确地处理异常并不是一项轻松的任务,这是因为异常的处理有时会导致程序出现其他不明行为。不过,以下三条规则可以帮助你避免错误处理异常所可能遭遇的风险。
规则 #1: 总是捕捉扔出异常的类型而不要理睬异常的超类。 清单B中的代码片断以示例的方式从错误编码和正确编码两个角度进行了说明。
为了遵守通常的代码习惯,你可以采用Exception类的大写字母作为变量名,如下所示:
catch(FileNotFoundException fnfe)
以及
catch(SQLException sqle)
规则 # 2: 决不让catch块留空。在很多情况下虽然确实编写了try/catch块但在代码的catch部分却什么都没有做。或者,假如采用了日志API(Logging API),那么请编写代码把异常写到日志中。
清单C 显示了以上编码的错误方式和正确方式。
规则 # 3: 决不扔出Exception基类的实例。开发人员应当总是扔出自己创建的异常类。
扔出异常的API很难处理。在声明方法扔出java.lang.Exception的情况下,清单A中所有的问题都会强加在API用户的头上,这样他们就无法以一种专业的编程方式来处理异常。通过为扔出API声明Exception类的子类这一举措,API开发人员就可以减轻用户的负担。
小结
以上提到的两种技术在处理异常时还可能用得更好、更适当。嵌套技术令异常扔到另一异常的内部,而捕捉适当的异常令程序调试大大简化。