java中的异常的捕获与抛出原则

在可能会出现exception的地方,要使用try-catch或者throws或者二者都要。个人判断依据是:若是对可能出现的exception不 想被外部(方法的调用者)知道,就在方法内部try-catch掉这个exception;若是但愿外部知道,则在catch到以后把exception 直接抛出或者抛出自定义的exception。  
1、异常的种类  
java异常能够分红两大类:Exception和RuntimeException(虽然RuntimeException是从 Exception继承的)。exception异常表明“没法避免的异常” 如io异常   每每这类异常是因为外部缘由形成的,程序自己没法保证他们不发生,因此这类异常必须捕获。若是在函数内部没法处理这个异常必须再次抛出(在函数后面用 throws语句),若是什么都不作就出现编译错误。
runtimexception是指“能够避免的异常”,如 null引用异常,这类异常都是由程序内部缘由形成的,是能够避免的。对于这类异常能够忽略他们,但一旦发生程序就会异常终止。这类异常对debug很是有帮助,固然,若是须要也能够catch。

另外,有些地方即便不会有exception,可是从商业逻辑上是错误的、非预期的,也能够抛出user exception。例如,用户输入非法,bank account非法透支等等。

2、主要原则  
处理意外的一个重要原则,就是要么处理,要么接着抛,决不能吃掉(You either handle it, or throw it. You don’t eat it.)这就是说,当你捕获一个异常以后,必须决定是否当即处理这个异常,或者继续抛出这个异常(或者另外一个自定义异常),以便由调用的客户端捕获之。当 客户端捕获到之后,又会继续进行相似的判断。

通常来讲,GUI端是要处理异常的,好比JSP捕获到异常以后,须要先是给用户一个友好的出错信息,而不要给出系统的出错信息。系统的出错信息一方面不太友好,另外一方面提供了太多的系统信息,容易被恶意用户用来攻击系统。

换句话说,全部的异常最终必须有一个终极的处理者,这就是GUI。至于中间的环节,好比在服务器端运行的JavaBean是否要处理捕获到的异常,仍是继续抛出所捕获的异常,须要视具体状况处理。  

除非你想把异常处理的责任交给调用者,通常不用throws。 好比你要读入一些文件,若是你想通知调用者,让调用者决定如何处理这个异常,你就把这个异常throws给调用者;若是你知道应该如何处理这个异常,或者你想把异常立刻解决,你能够就地catch她。

这彻底取决于你想把异常本身当即处理仍是想把处理责任返回给调用者。取决于你的程序的结构和要求。  
须要注意的有:
一、若是没法处理某个异常,那就不要捕获它。  
二、若是捕获了一个异常,请不要胡乱处理它。  
三、尽可能在靠近异常被抛出的地方捕获异常。  
四、在捕获异常的地方将它记录到日志中,除非您打算将它从新抛出。  
五、按照您的异常处理必须多精细来构造您的方法。  
六、须要用几种类型的异常就用几种,尤为是对于应用程序异常。  

3、异常嵌套和捕获适当的异常

按照Java语言的定义,所谓异常(Exception)指的就是向调用方法(calling method)表示发生非正常状况的习惯方式。下面讨论两种在处理异常时可兹利用的技术:异常嵌套和捕获适当的异常。

异常嵌套  
你在试图捕获异常并打算扔出异常时该采起什么措施呢?同时,你但愿原始的异常信息可用吗?  

要回答以上的问题你不妨尝试一下NestedException类。具体的编程并不难,惟一要作的无非是利用构造器而且重载printStackTrace()以便显示出正确的数据。

此外,你还应当考虑封装Throwable而非Exception类来建立更具备重用性的组件。以后,你能够建立NestedRuntimeException变量封装Throwable但无需对其进行声明。

捕获适当的异常
正确地处理异常并非一项轻松的任务,这是由于异常的处理有时会致使程序出现其余不明行为。不过,如下三条规则能够帮助你避免错误处理异常所可能遭遇的风险。

规则 #1: 老是捕获扔出异常的类型而不要理睬异常的超类。 为了遵照一般的代码习惯,你能够采用Exception类的大写字母做为变量名,以下所示:  
    catch(FileNotFoundException fnfe)  
以及
    catch(SQLException sqle)

规则 # 2: 决不让catch块留空。在不少状况下虽然确实编写了try/catch块但在代码的catch部分却什么都没有作。或者,若是采用了日志API(Logging API),那么请编写代码把异常写到日志中。

规则 # 3: 决不扔出Exception基类的实例。开发人员应当老是扔出本身建立的异常类。

扔出异常的API很难处理。在声明方法扔出java.lang.Exception的状况下,全部的问题都会强加在API用户的头上,这样他们就 没法以一种专业的编程方式来处理异常。经过为扔出API声明Exception类的子类这一举措,API开发人员就能够减轻用户的负担。

以上提到的两种技术在处理异常时还可能用得更好、更适当。嵌套技术令异常扔到另外一异常的内部,而捕获适当的异常令程序调试大大简化。java

相关文章
相关标签/搜索