一道面试题引发的思考:(2)

智极追光
• 阅读 3082

题目

一道面试题引发的思考:(2)

答案:D

分析

Java 异常的结构体系

一道面试题引发的思考:(2)

Throwable 类包含了其线程创建时线程执行堆栈的快照,包含了给出有关错误更多的消息字符串,
有颜色的代表运行时异常,非checked exception,可以不try catch ,则由jvm处理,白色的异常代表checked exceptions必须由try-catch捕获。

非RuntimeException

非runtimeException 一般是外部错误,例如:从文件尾后读取数据,这并不是程序本身的错误,而是应用环境的错误,凡是继承Throwable的,都可以捕获,抛出。

ERROR

Error由虚拟机生成并抛出,,属于JVM系统内部错误或者资源耗尽等严重情况,属于JVM需要担负的责任,这一类异常事件是无法恢复或者不可能捕获的,将导致应用程序中断,但是自定义Error是可以捕获的。

package com.mousycoder.error;

public class MyError extends Error{

    public MyError() {
        super();
    }
    
    MyError(String msg) {
        super(msg);
    }
    
    public static void main(String[] args) {
        
        try {
            throw new MyError("error");
        } catch (Throwable e) {
            System.out.println("catching!");
        }
        
    }
    

}

异常机制

传统异常是由函数返回一个特殊的结果表示,例如: -1表示异常,有时候 -1确是表示正确的值,这样代码可读性差,正确的处理和异常处理代码在一起,异常则由程序员来处理,要求比较高,经过改良之后,程序出现异常,则程序流程发生改变,控制权转到异常处理器,由异常处理器处理,异常处理器也是有很多的,直到找到一个适合的异常处理器,并处理异常。

异常的转译

  • ERROR到Exception

一道面试题引发的思考:(2)

比如讲SQLException转成DAOException,让异常更加准确的表达

package com.mousycoder.error;

import java.sql.SQLException;

public class DAOException extends Throwable{
    public DAOException() {
        super();
    }
    
    DAOException(String msg,Throwable e){
        super(msg, e);
    }
    
    public static void main(String[] args) throws DAOException {
        SQLException s = new SQLException();
        throw new DAOException("dao异常",s);
    }
    
}

console

Exception in thread "main" com.mousycoder.error.DAOException: dao异常
    at com.mousycoder.error.DAOException.main(DAOException.java:16)
Caused by: java.sql.SQLException
    at com.mousycoder.error.DAOException.main(DAOException.java:15)

Spring中DispatcherServlet的doDispatch()方法将Error转成Exception,挽回错误发生带来的负面影响。

    private void triggerAfterCompletionWithError(HttpServletRequest request, HttpServletResponse response,
            HandlerExecutionChain mappedHandler, Error error) throws Exception, ServletException {

        ServletException ex = new NestedServletException("Handler processing failed", error);
        if (mappedHandler != null) {
            mappedHandler.triggerAfterCompletion(request, response, ex);
        }
        throw ex;
    }
  • Exception到RuntimeException

将检查异常转成非检查异常,让代码变得优雅,但是增加了系统发生系统的可能性

  • Error到RuntimeException

代码简洁,统一异常处理

异常链

将异常的原因一个一个串起来,底层信息传给上层,逐级传递

模型:

try {
     lowLevelOp();
    } catch (LowLevelException le) {
     throw (HighLevelException)
      new HighLevelException().initCause(le);
}

感谢您的耐心阅读,如果您发现文章中有一些没表述清楚的,或者是不对的地方,请给我留言,你的鼓励是作者写作最大的动力,
如果您认为本文质量不错,读后觉得收获很大,不妨小额赞助我一下,让我更有动力继续写出高质量的文章。

  • 支付宝
    一道面试题引发的思考:(2)

  • 微信
    一道面试题引发的思考:(2)

作 者 : @mousycoder

原文出处 : http://mousycoder.com/2015/10/14/thinking-of-interview-question-2/

创作时间:2015-9-22

更新时间:2015-10-14

点赞
收藏
评论区
推荐文章
cpp加油站 cpp加油站
4年前
题解5道c++面试题第一期(含解题思路、答案解析和实现代码)
本篇文章送上5道c/c面试题目,并附上答案、解题思路以及扩展知识。1.求下面函数的返回值cinclude<stdio.hintfunc(intx)intiCnt0;while(x)iCnt;xx&(x1);returniCnt;intmain()printf("cnt%d\n",func(9999
Stella981 Stella981
3年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
Prometheus监控学习笔记之PromQL简单示例
0x00简单的时间序列选择返回度量指标http_requests_total的所有时间序列样本数据:http_requests_total返回度量指标名称为http_requests_total,标签分别是job"apiserver",handler"/api/comments"
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
03.Android崩溃Crash库之ExceptionHandler分析
目录总结00.异常处理几个常用api01.UncaughtExceptionHandler02.Java线程处理异常分析03.Android中线程处理异常分析04.为何使用setDefaultUncaughtExceptionHandler前沿上一篇整体介绍了crash崩溃
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Stella981 Stella981
3年前
Docker 部署SpringBoot项目不香吗?
  公众号改版后文章乱序推荐,希望你可以点击上方“Java进阶架构师”,点击右上角,将我们设为★“星标”!这样才不会错过每日进阶架构文章呀。  !(http://dingyue.ws.126.net/2020/0920/b00fbfc7j00qgy5xy002kd200qo00hsg00it00cj.jpg)  2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
贾蔷 贾蔷
1个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们