zl程序教程

您现在的位置是:首页 >  后端

当前栏目

Atitit 异常处理之道 attilax著.docx 1. 概念 2 1.1. 异常机制的设计原理 2 1.2. Atitit.异常机制的设计原理.docx java 2 1.3. JVM看Exc

JAVAJVM概念异常原理 处理 设计 机制
2023-09-14 09:03:25 时间

Atitit 异常处理之道 attilax.docx

 

1. 概念 2

1.1. 异常机制的设计原理 2

1.2. Atitit.异常机制的设计原理.docx java 2

1.3. JVM看Exception本质.javaex设计throry 2

1.4. 终止模式  vs 恢复模式(asp 2

1.5. 异常处理的优点 3

1.6. 异常代替if else流程处理 3

2. 异常处理的历史演变 3

2.1. 异常vs 返回码 3

2.2. 返回码模式的处理 瀑布if 跳到失败 3

2.3. Js java c# php中以类库实现异常catch 3

2.4. Check ex vs unchk ex 3

3. 分类 4

3.1. 业务异常 与技术异常 4

3.2. 可恢复异常与不可恢复异常 4

3.3. 设计异常与运行时异常 check ex vs runtime ex 4

3.4. 异常和错误err 4

4. 常见的异常清单列表体系 4

5. 最佳实践与注意要点 4

5.1. 处理反射方法的异常 4

5.2. 重新抛出异常和异常链 5

5.3. 注意增加对error的处理 6

5.4. 异常 vs 流程控制 6

5.5. Finally 异常丢失的处理 6

6. 处理策略 7

6.1. 全局异常捕获 7

6.2. 转换为本层的业务异常,抛出至上层处理(推荐)例如从通信层异常转为业务异常,方便理解 7

6.3. 事务rollback 7

6.4. 日志记录,重新抛出 7

6.5. 忽略异常(较少这样处理) 7

6.6. exception异常转换为运行时异常,避免上层强制处理异常的繁琐代码,为了代码简洁 7

6.7. 捕获throwable 代替捕获exception 8

6.8. 可恢复error的捕获处理,捕获后使用备份b方案,提升可靠性 8

7. Gui异常处理推荐与策略 9

7.1. 弹出选择框供用户处理,自动消失一段时间 9

7.2. 只弹出提示框,自动小孩 9

8. 分布式系统的异常处理 9

8.1. 异常抛出 9

8.2. 异常传输   跨平台异常的传输可以使用json,xml来序列化传输.. 9

8.3. 异常转换(从源语言转换为目标语言异常)and抛出 9

8.4. 异常处理 9

9. 参考资料 10

9.1. Java 异常详解 - weisg81的专栏 - 博客频道 - CSDN.NET.html 11

9.2. Atitit 跨平台异常处理 11

9.3. atitit javajs的异常转换.docx 11

9.4. Atitit java的异常exception 结构Throwable 11

9.5. 11

9.6. atitit 常见的异常分类 11

9.7. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 11

9.8. Atitit 异常的操作api attilax总结 org.apache.commons.lang3.exception 11

9.9. atitit 异常机制的设计原理 (2) 11

9.10. Atitit.android崩溃日志 全局异常捕获机制 11

9.11. Atitit.window.onerror 全局异常对象在不同浏览器的表现 11

9.12. Atitit.应该内置的 常见业务异常 11

9.13. Atitit避免出现空指针异常解决方案 11

9.14. 笑谈软件工程:异常处理的设计与重构 12

9.15. Atitit 优雅的处理异常attilax大总结.docx 12

9.16. 12

1. 概念

1.1. 异常机制的设计原理

1.2. Atitit.异常机制的设计原理.docx java

1.3. JVM看Exception本质.javaex设计throry

1.4. 终止模式  vs 恢复模式(asp

Java对于异常的处理采取的是终止模式,一旦发生问题,程序将不能继续执行,与之对应的是恢复模式,就是当异常抛出时,程序能够继续执行,而不是终止。在Java中如果我们要使用恢复模式,就需要将try块放在while循环中,直到满意,但这明显是不靠谱的,也是我们不提倡的。所以当当前方法终止时,我们只能在异常处理块中使程序向不同的方向继续执行,而具体向什么方向,取决于具体的实现

1.5. 异常处理的优点

1.6. 异常代替if else流程处理

2. 异常处理的历史演变

2.1. 异常vs 返回码

 

2.2. 返回码模式的处理 瀑布if 跳到失败

参考 错误处理的四种方法 - 李奥霍克 - 博客园.html

 

 

2.3. Js java c# php中以类库实现异常catch

catchEx("com.attilax.user.NotLoginEx",error, (){

xxxx

}})

Finally(e,(){})

exStart()

参考资料 atitit  atijavaexconverter4js  新的特性

2.4. Check ex vs unchk ex

 

3. 分类 

3.1. 业务异常 与技术异常

3.2. 可恢复异常与不可恢复异常

3.3. 设计异常与运行时异常 check ex vs runtime ex

3.4. 异常和错误err

4. 常见的异常清单列表体系

5. 最佳实践与注意要点

 

5.1.  处理反射方法的异常

 

public static void throwExV3(Throwable e,String msg) {

if(e instanceof InvocationTargetException )

{

e=e.getCause();

}

if( e instanceof RuntimeException)

{

Throwable e3=e.getCause();

 RuntimeException runtimeException = new RuntimeException(msg,e3);

 throw runtimeException;

//  throw (RuntimeException)e;

}

  else

  throw new RuntimeException(msg,e);

 

}

 

 

5.2. 重新抛出异常和异常链

有时我们在捕获到异常后,可能在捕获的地方不适合处理该异常,我们需要将它重新抛出:

    catch(Exception e){

        throw e;

    }

这样有一个好处,我们可以将异常交给上一级环境处理,但是这样就会存在一个问题,抛出的的异常携带的信息,也就是printStackTrace()方法显示的是原来异常抛出点的调用栈信息,而非重新抛出点的信息,这样重新抛出点的调用信息就被掩盖了。如果想更新重新抛出点信息到这个异常调用栈中,就可以使用fillInStackTrace()方法:

catch(Exception e){

    throw e.fillInStackTrace();

}

那么当前调用栈的信息就更新到了这个异常对象中了,还有一种情况,也会存在类似的丢失现象:

catch(Exception e){

    throw new Exception();

}

5.3. 注意增加对error的处理

增加了对java.lang.Error的支持

5.4. 异常 vs 流程控制

顺气自然,有的ex ,有的process

5.5. Finally 异常丢失的处理

 

我们把最外一层try看着是上一级程序的处理,在这个try里面发生了两次异常,但是我们只能获得从finally中抛出的异常信息,而在f()方法中的异常信息丢失,这种情况我们称上一个异常被抑制了。这在JDK1.7之前同样需要我们自己编码去解决这个问题,在JDK1.7之后,新加入了两个方法帮助我们能够很好的去解决这个问题了,那就是addSuppressed(Throwable exception)和getSuppressed(),对于上述问题的解决:

 

public static void main(String[] args) { try { Test test = new Test(); Exception exception = null; try { test.f(); } catch (VeryImportantException e) { exception = e; } finally { try { test.dispose(); } catch (OtherException e) { if (exception != null) { exception.addSuppressed(e); } else { exception = e; } } if (exception != null) { throw exception; } } } catch (Exception e) { System.out.println(e); for (Throwable throwable : e.getSuppressed()) { System.out.println(throwable); } } }

 

 

6. 处理策略

6.1. 全局异常捕获

atitit js浏览器环境下的全局异常捕获 v2 qa1

6.2. 转换为本层的业务异常,抛出至上层处理(推荐)例如从通信层异常转为业务异常,方便理解

 

从通信层异常转为业务异常,方便理解

主要是业务层处理与view层处理

一般是 catch Lower Level Exception,但是向外抛出的却是 Higher Level Exception,对异常进行转换。

 

6.3.  事务rollback 

rollback 的尽量 rollback

6.4. 日志记录,重新抛出

主要用来统计分析稳定性情况,预警等

 

6.5. 忽略异常(较少这样处理)

为了提升稳定性,需要冗余处理的时候,可以这样做。。。

 

 

6.6. exception异常转换为运行时异常,避免上层强制处理异常的繁琐代码,为了代码简洁

比如一些gbk utf8的编码异常,铁定不会有问题的,转换为runtime更好。。

 

6.7. 捕获throwable 代替捕获exception

throwable 还包括一些编译错误,类没有加载啦都可以捕获。

 

6.8. 可恢复error的捕获处理,捕获后使用备份b方案,提升可靠性

许多书上说,不要捕获error,无法恢复,比如 加载jdbc驱动 json类库,类没有编译等。。

实际上,捕获error是十分重要的,也是可以恢复的。。

一般使用冗余多重jar包来避免jar hell。。当一个类没有加载起来,那么加载他的备用jar就是了。

提升可靠性,统一类型类库,要有不同的三个备份比较保险。。比如处理json,可同时使用三个不同的jar来处理。大大减少了类库冲突造成的类库失效的现象。。。

 

7. Gui异常处理推荐与策略

7.1. 弹出选择框供用户处理,自动消失一段时间

7.2. 只弹出提示框,自动小孩

8. 分布式系统的异常处理

8.1. 异常抛出 

8.2. 异常传输   跨平台异常的传输可以使用json,xml来序列化传输..

 

8.3. 异常转换(从源语言转换为目标语言异常)and抛出

 

例如,java异常转换为c# 异常或者 js异常...

 

异常类型,异常消息,异常堆栈,异常json,xml源文本.

然后  抛出..

 

 

8.4. 异常处理

 

 

 

 

 

 

9. 参考资料

 

9.1. Java 异常详解 - weisg81的专栏 - 博客频道 - CSDN.NET.html

9.2. Atitit 跨平台异常处理

9.3. atitit javajs的异常转换.docx

9.4. Atitit java的异常exception 结构Throwable

9.5.  

9.6. atitit 常见的异常分类

9.7. Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换

9.8. Atitit 异常的操作api attilax总结 org.apache.commons.lang3.exception

9.9. atitit 异常机制的设计原理 (2)

9.10. Atitit.android崩溃日志 全局异常捕获机制

9.11. Atitit.window.onerror 全局异常对象在不同浏览器的表现

9.12. Atitit.应该内置的 常见业务异常

9.13. Atitit避免出现空指针异常解决方案

9.14. 笑谈软件工程:异常处理的设计与重构

9.15. Atitit 优雅的处理异常attilax大总结.docx

9.16.  

作者:: 绰号:老哇的爪子 ( 全名::Attilax Akbar Al Rapanui 阿提拉克斯 阿克巴 阿尔 拉帕努伊 ) 

汉字名:艾提拉(艾龙)   EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

Atiend