`
ronghao
  • 浏览: 449076 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
E9473dd5-1985-3883-ac98-962354ca10b3
张小庆,在路上
浏览量:8550
社区版块
存档分类
最新评论

关于异常的问与答

阅读更多

今天的问题是关于异常,自然,今天的主角是异常之神。

我问:大神,异常到底是个什么东西哩?什么情况下我们需要抛出异常呢
果然是异常之神,很异常,反问:如果老婆叫你去超市买虾,虾刚好卖光了,你会怎么办?
我想都没想,说:给老婆打电话哈!
神仙说:这就是异常!
我说:不能完成买虾这个任务?
神仙说:不在你控制范围内的因素所造成的问题、没有预料到的情况就叫异常。在上面这个例子里,由于你没法控制超市是否还有虾,所以当你面临这个问题而又无法自己解决时就会抛出这个异常。
我说:哦,异常有两个特点,一个是造成不能正常执行任务的因素不在我的控制范围,二是我自己没有足够的信息进行处理,只能抛出。

我问:我知道JAVA里异常有checked和runtime之分,用哪个好呢?
神仙说:继续前面的问题,你和老婆打了电话,结果发现是女儿要吃虾,这时会怎么办呢?
我说:老婆会让我等等,然后去问我女儿,然后再回答我,女儿说了,可以吃鱼。
神仙说:实际处理这个问题的是你女儿?
我说:是的。
神仙说:那为什么你不直接让你女儿接电话哩?
我说:因为女儿管她妈妈,她妈妈管我。
神仙说:如果是checked异常,那么尽管妈妈不能处理这个问题,她还是需要处理;如果是runtime,那么妈妈就不用操心啦。
我说:我明白了,checked异常强制我们在发生异常的地方进行处理,哪怕实际我并不能处理,只会产生一坨一坨的try catch,runtime能够让我们在能够处理异常的地方才捕获这个异常。
神仙说:异常处理有一项很重要的目标,就是将处理异常的代码从异常发生的地方移开。这样就能在一个地方集中精力去解决你想解决的问题,然后再到另一地方去处理这些异常问题。程序的主线就不会被异常处理这类枝节问题给搞得支离破碎,程序也更易于理解和维护。
我说,所以都用runtime异常,第三方的checked异常如果不能立即处理,那么也应该转为runtime。
神仙说,异常处理的一个重要准则是:如果你不知道该如何处理这个异常,那么你就别去捕捉它。

我说,太好了,checked异常必须处理,runtime异常不用处理!
神仙说,你会直接在用户界面打印出一坨坨黑白相间的美妙异常栈?
我说,当然不会,我会统一跳转到一个出错页面。
神仙说,难道这不是对异常的处理吗?
我说,恩,也是。
神仙说,所有异常必须处理!在程序里可以抛异常,但是决不能把异常抛给最终用户。BUG在程序员手里还不是BUG,但是一旦交付,那么就是BUG。

我问:出现异常的地方我直接new RuntimeException()可以吗?反正最后是告诉老婆买不成虾。
神仙说,如果你女儿问为什么没买到虾怎么办?
我说,我会告诉她虾卖完了。
神仙说,信息在哪儿呢?
我说,我明白了,扔出异常一定要加上异常信息。
神仙说,非常重要!对于最终用户可能仅仅是个出错页面,但是对于需要解决这个问题的程序员来说,异常信息就非常重要了。
我说,所以如果是自定义异常,那么一定要加异常信息;如果是checked异常转runtime则一定要保存原有的异常,形成异常栈。

我问:好吧,我看到很多程序都自定义异常。
神仙说,如果是通货膨胀钱没带够而买不了虾怎么办?
我说,我会回家取钱。
神仙说,那么如果是虾没了呢?
我说,那买个鬼,卖鱼罗。
神仙说,所以需要自定义异常,这样可以产生不同的异常处理策略。
我说,如果需要对不同的异常进行不同的处理,那么就需要自定义异常。
神仙说,自定义异常需要有自己的继承体系,这样当我不想单个处理时,可以对一种类型的异常采用统一的一种处理,例如spring的DataAccessException。

我暗喜:正在写工作流异常模式哩,何不一起问一下?哈哈。
神仙说:未完待续,敬请期待工作流异常的问与答。









分享到:
评论
2 楼 fenian_zhq 2012-08-10  
写的很不错,如果有伪代码样例就更好了。。。
1 楼 chenlei1728 2011-05-09  
学习了!很有创意!思考的也很深入!

相关推荐

    Visual Basic 2010入门经典.part1.rar

    1.10 问与答 34 1.11 作业 35 1.11.1 测验 35 1.11.2 答案 35 1.11.3 练习 35 第二章 Visual Basic 2010导航 36 2.1 使用Visual Basic 2010起始页 36 2.1.1 创建新项目 37 2.1.2 打开现有项目 38 2.2 导航...

    Visual Basic 2010入门经典.part2.rar

    1.10 问与答 34 1.11 作业 35 1.11.1 测验 35 1.11.2 答案 35 1.11.3 练习 35 第二章 Visual Basic 2010导航 36 2.1 使用Visual Basic 2010起始页 36 2.1.1 创建新项目 37 2.1.2 打开现有项目 38 2.2 导航...

    SQL21日自学通

    问与答 38 校练场 38 练习 39 第三天表达式条件语句与运算 40 第四天函数对数据的进一步处理 60 目标 60 汇总函数 60 COUNT61 SUM 61 AVG 63 MAX 63 MIN 64 VARIANCE65 STDDEV66 日期/时间函数66 ADD_MONTHS 67 ...

    Woof.WebSocket:WebSocket模块,用于快速构建基于WebSocket的API

    答:使事件处理程序“异步无效”,并确保没有异常抛出。 问:服务器可以与其他环境(非.NET)中的客户端一起使用吗? 答:是的。 WOOF编解码器使用兼容的Google协议缓冲区序列化程序,该序列化程序可用于许多环境...

    iphoneqq在线软件|雪花卡iphone永久在线软件 v4.3.zip

    雪花iPhoneQQ在线软件可以让您没有iPhone手机,但是照样可以在好友那里显示iPhoneQQ在线,...问:我的QQ正常,用软件登录却提示“异常错误”,这是怎么了? 答:这个我也不知道。这个情况一般是10位的QQ出现比较多。

    JD-GUI,JDGUI,java反编译工具

    java反编译工具: JD-GUI JD-GUI 是一个用 C++ 开发的 Java 反编译工具... (它的作用就是根据class字节码文件,反解析出当前类对应的code区(汇编指令)、本地变量表、异常表和代码行偏移量映射表、常量池等等信息。)

    《深入理解Android》卷Ⅰ

    8.6.2 ViewRoot的你问我答 8.6.3 LayerBuffer分析 8.7 本章小结 第9章 深入理解Vold和Rild 9.1 概述 9.2 Vold的原理与机制分析 9.2.1 Netlink和Uevent介绍 9.2.2 初识Vold 9.2.3 NetlinkManager模块分析 9.2.4 ...

    PowerAmp v2.0.9-build-528 FULL

    音量更改异常。 其他音量问题。 答:尝试从“Poweramp 设置 => 音频引擎 => 高级选项”中禁用“直接音量控制”。 Poweramp 2.x 在2.3+ 中高终端设备中默认使用“直接音量s控制”。 在官方 ROM 下可产生更好的音频...

    DirectX_Repair_V3.7_增强版.zip

    答:本程序致力于解决0xc000007b错误,因此只有在程序检测到系统中c++存在异常,可能导致0xc000007b问题,而修复时又没有使用增强版修复相应c++时,才会弹出此提示。而对于那些根本没有安装c++的系统,程序则不会...

    深入理解Android卷1全

    8.6.2 ViewRoot的你问我答 / 384 8.6.3 LayerBuffer分析 / 385 8.7 本章小结 / 394 第9章 深入理解Vold和Rild / 395 9.1 概述 / 396 9.2 Vold的原理与机制分析 / 396 9.2.1 Netlink和Uevent介绍 / 397 9.2.2 初识...

    迷你英语背单词

    问与答FAQ: Q1 为什么我的机器上音标始终显示不正常? A: 可能与您的操作系统的权限有关; 解决方法: 安装完毕后,进入点击”开始”,-“设置”-”控制面板”, 打开”字体”项目, 把音标字体文件拷贝进去即可。 Q2为...

    溢价转让股权需缴纳哪些税.doc

    梧村地税分局答:随着市场经济的健全与完善,企业各式改制活动日趋频繁,由此引发的个人股权转让经济行为也表现得异常活跃。去年以来,梧村分局辖区内就发生了两例公司个人股东的股权转让行为,涉及缴交个人所得税计...

    分布式深度学习库Deeplearning4j.zip

    DL4J神经网络受限玻尔兹曼机卷积网络 (图像)递归网络/LSTMs(时间序列和传感器数据)递归自动编码器深度置信网络深度自动编码器(问-答/数据压缩)递归神经传感器网络(场景、分析)堆叠式降噪自动编码器更多...

    电磁炉维修问答(下)

    问5:美的MC-EF197B 电磁炉,判锅困难,放上锅具后由硷锅状态进入加热状态的时间很长,多在3 s以上,怎样检修?  答:维修思路:该机使用的是“美的”公司2005 年的标准板电路结构,在对故障电磁炉进行试机时,...

    电子维修中的电磁炉维修问答(下)

    问5:美的MC-EF197B 电磁炉,判锅困难,放上锅具后由硷锅状态进入加热状态的时间很长,多在3 s以上,怎样检修?  答:维修思路:该机使用的是“美的”公司2005 年的标准板电路结构,在对故障电磁炉进行试机时,...

    games.directory:您的个人游戏.cloud目录

    '常问问题问:会有API吗? 答:是的,虽然没有预计到达时间。统计games.directory在过去的5年中一直处于活动状态,在此期间,由于数据异常,我们不接受新注册。 3.342位活跃用户。 自注册以来每周至少登录过1次的...

    C#上位机源码串口调试助手

    既然差不多知道什么是上位机与下位机,那么,我们做到小喇叭的要求:就得写个上位机,我自己也是学了下C#,用来开发上位机还是可以的,开发环境用visual studio 2015,微软的软件真的是很简单,之前看到有人问为什么...

    深入理解Android:卷I--详细书签版

    8.6.2 ViewRoot的你问我答 384 8.6.3 LayerBuffer分析 385 8.7 本章小结 394 第9章 深入理解Vold和Rild 395 9.1 概述 396 9.2 Vold的原理与机制分析 396 9.2.1 Netlink和Uevent介绍 397 9.2.2 初识Vold 399 ...

    史上超高压缩软件2009

    异常错误处理以及改善很多细节设定.(5)经过了大量测试,保证了压缩/解压的稳定性. 0.231 加入了解压时自定解压缩文件的路径.出现错误时立即停止程序而不继续压缩/解压. 优化内核程序使压缩/解压速度提高了4%.增加了...

Global site tag (gtag.js) - Google Analytics