当前位置:   article > 正文

第一章 java 基础 - 07异常处理_什么是不受控异常 java

什么是不受控异常 java

无意间都到一篇《走心的安卓工程师跳槽经验分享》,发现自己工作几年了,技术方面虽然有了飞跃的进步,可是不知道自己的技术到了什么地步,每个方面我都涉及到了,但都不深,这大概是初级工程师的诟病吧!

即使知道也不知道从何下手,非常感谢《走心的安卓工程师跳槽经验分享》的作者!

感兴趣的朋友和我一起走下去吧!

07异常处理

理论上异常处理划分为两个模型(中止模型与继续模型),但实际使用方面我们对中止模型用的比较多,这个模型比较实用,而继续模型则不是那么的应用普遍,多少是耦合的过于紧密。

处理机制
为什么要自定义自己的Exception ,Java Exception机制与传统的C语言的异常处理机制有什么不同,这种Exception机制的意义在什么地方?接下来咱就来和你一起探讨Exception 的优缺点。

早期的C语言的异常处理机制,通常是我们人为的对返回结果加一些标志来进行判定,比如发生错误返回什么标志,正常情况下我们又是返回什么标记,而这些都不是语言本身所赋予我们的,而对于C语言这种机制又有什么问题哩?为什么新一代的语言 Java Ruby C# 等都用Exception机制而不是维持C语言的老样子?这些都是我们需要思考的问题。

C语言的异常处理机制全是我们人为的定义,这样就会造成业务逻辑的主线受到异常处理的牵制,或者说是我们难免会将注意力转移,并且造成业务逻辑与异常处理之间有很大程度上的缠绕。

中止模型
假设错误非常严重,已至你无法在回到错误发生的地方,也就是说,这段程序经过判断认为,他已经没有办法挽回,于是就抛出异常,希望这个异常不要在回来,这也是Java 当前所采用的模式。

继续模型
这种模型的主旨是恢复当前的运行环境,然后希望能够重新回到错误的发生地,并希望第二次的尝试能够获得成功,这种模型通常为操作系统所应用。

好处:
让异常处理与业务逻辑的主线分离,我们对可以遇见的异常作分支处理,其实将业务逻辑与异常处理分离也是Exception设计的主旨,其次Java Exception 不需要像C语言那样在程序的多个地方去检测同一个错误,并就地作异常的处理,相比老式的错误处理,现行的错误处理的结构则来的更加清晰。

用法

  public class T {
        UserManager manager = new UserManager();
        public void testloadUser(String username, String password, String name, String email) {
            try {
                manager.loadUser(username);
            }
            catch (UserNotFoundException unfe) {
            }
        }
    }    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
    public class UserManager {
        public User loadUser(String username) throws UserNotFoundException {
            Connection con = null;
            PreparedStatement pstmt = null;
            try {
                pstmt = con.prepareStatement("select User form user where id=1");
                pstmt.setString(1, username);
                ResultSet rs = pstmt.executeQuery();
                if (!rs.next()) {
                    throw new UserNotFoundException();
                }
                return null;
            } catch (SQLException ex) {
                return null;
            }
        }
    }
    
    class User {
    }
    
    public class UserNotFoundException extends Exception {
        private Throwable nestedThrowable = null;
        public UserNotFoundException() {
            super();
        }
        public UserNotFoundException(String msg) {
            super(msg);
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

在这里我们自定义了自己的UserNotFoundException异常,这样在客户调用loadUser()方法的时候Java就可以强制检测到这个UserNotFoundException异常,这样我们就可以作相应的处理工作,在这里应该可以看到testloadUser这里对UserNotFoundException这个异常有一个分支处理,这样的异常分支处理是不是很清晰哩,在此我不对他作解释,因为实在比较简单,其实美好的东西在我看来都有一个度,当这个度被你所打破后,那么他将不会再美好,Exception机制的应用也是,而这个度就需要你自己在实际项目中去斟酌了,接下来我就会阐述Exception的缺点。

Java 有将受控异常和运行时异常模型都实现,Rod Johnson认为在Java中主要实现运行时异常模型,至于受控异常则为辅,而Bruce Eckel则来的更为偏激一些,他认为Java只需要实现运行时异常模型,而受控异常没有必要继续存在,为什么他们都这么认为哩,而且Bruce Eckel 之前很是推崇受控异常地,其实也没那么多为什么,这些思维的改变不过就是他们在实践当中发现了很多问题且对Exception 认识也更深刻了呗,所以说大师不是天生的,大师也需要学习,在这里我更赞成Rod Johnson 对Exception的观点,OK,废话我也不多说了,说说我认识中的Java Exception 缺点!

1 、当一个方法中被过多的抛出受控异常,那么在别人调用的时候会造成try/catch语句的泛滥,甚至经常出现嵌套异常,使得代码的可读性下降。

2、在某些方面检测系统的异常也并没有实际的意义,因为当出现这种异常的时候一般代表问题很严重我们无法恢复,如:捕获数据库SQLException异常,该异常对我们来说没太大意义,因为错误信息太模糊,通常都是一些堆栈上的信息,看Rod Johnson 设计的关于JDBC方面的Exception Framework相信会对您产生很大的触动。

3、在大型系统中受控异常同时会造成异常处理类的泛滥,其实本人并没有介入过什么大型的Java 系统的设计工作,所以我也无从对这指三道四,没有实践就没有发言权,但我在一般的系统已经多少看到了一些这样的问题。
最后希望我的这篇解说能够进一步的增加你对 Java Exception 机制的了解,如果您还是不太清楚Exception机制,那么我推荐你看 《Thinking in Java》 这本书的第三版以及Rod Johnson的 expert one on one 系列书籍

建立Exception 时建议日常开发中需要注意以下几点:

一、Throw new exception
曾经看过有人在简单的函数内疯狂的使用throw new 参与业务逻辑。比如,以下代码:
逻辑类似以上代码,就是一个单一的函数,每当我看到这样的单一函数,总是觉得很奇怪。或许是自身水平有限,似乎难以理解为了catch住一个exception对象需要那么大费周章的去throw new 么?个人认为如果某方法内嵌套的方法根据业务逻辑主动抛出异常,让外层方法截获到这个异常,此时被嵌套的方法方可使用throw new …

二、抛出不该抛出的Exception
上文中的DoSomeThing函数如果在catch时不进一步封装,直接把Excepiton抛到UI层,又或者直接显示给客户。如果异常堆栈中提示某些敏感数据。比如SQL查询语句、WebService
URI或POST信息等。这些敏感信息应该永远不让客户知道,暴露出这些信息有可能对系统造成潜在安全隐患!
类似以上机制,如果异常出现了,我认为可以大大减少debug的时间。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/252805
推荐阅读
相关标签
  

闽ICP备14008679号