try catch 所有异常的是不是可以捕捉所有的

trackbacks-0
前言:java 中的异常处理机制你真的理解了吗?掌握了吗?catch 体里遇到 return 是怎么处理? finally 体遇到 return 怎么办?finally 体里有 System.exit() 方法怎么处理?当 catch 和 finally 体里同时遇上 return 怎么办?相信你在处理异常的时候不是每次都把它 throws 掉就完事了,很多时候异常是需要我们自己来 catch 并针对所抛出的 Exception 做一些后续的处理工作。直接上代码,先贴下面测试需要调用的方法:
&1&2&&&&//&catch&后续处理工作&3&&&&public&static&boolean&catchMethod() {&4&&&&&&&&System.out.print("call&catchMethod&and&return&&---&&&&");&5&&&&&&&&return&false;&6&&&&}&7&&&&//&finally后续处理工作&8&&&&public&static&void&finallyMethod() {&9&&&&&&&&System.out.println();<span style="color: #&&&&&&&&System.out.print("call&finallyMethod&and&do&something&&---&&&&");<span style="color: #&&&&}<span style="color: #1. 抛出 Exception,没有 finally,当 catch 遇上 return
&1&2public&static&boolean&catchTest() {&3&&&&&&&&try&{&4&&&&&&&&&&&&int&i&=&<span style="color: #&/&<span style="color: #;&& //&抛出&Exception,后续处理被拒绝&5&&&&&&&&&&&&System.out.println("i&vaule&is&:&"&+&i);&6&&&&&&&&&&&&return&true;&&&&//&Exception&已经抛出,没有获得被执行的机会&7&&&&&&&&}&catch&(Exception&e)&{&8&&&&&&&&&&&&System.out.println("&--&Exception&--");&9&&&&&&&&&&&&return&catchMethod();&&&&//&Exception&抛出,获得了调用方法并返回方法值的机会<span style="color: #&&&&&&&&}<span style="color: #&&&&}<span style="color: #后台输出结果:
<span style="color: #<span style="color: #&--&Exception&--<span style="color: #call&catchMethod&and&return&&---&&&&false<span style="color: #2. 抛出 Exception,当 catch 体里有 return,finally 体的代码块将在 catch 执行 return 之前被执行
&1&2public&static&boolean&catchFinallyTest1() {&3&&&&&&&&try&{&4&&&&&&&&&&&&int&i&=&<span style="color: #&/&<span style="color: #;&//&抛出&Exception,后续处理被拒绝&5&&&&&&&&&&&&System.out.println("i&vaule&is&:&"&+&i);&6&&&&&&&&&&&&return&true;&&&//&Exception&已经抛出,没有获得被执行的机会&7&&&&&&&&}&catch&(Exception&e)&{&8&&&&&&&&&&&&System.out.println("&--&Exception&--");&9&&&&&&&&&&&&return&catchMethod();&&//&Exception&抛出,获得了调用方法的机会,但方法值在&finally&执行完后才返回<span style="color: #&&&&&&&&}finally{<span style="color: #&&&&&&&&&&&&finallyMethod();&&//&Exception&抛出,finally 代码块将在&catch&执行&return&之前被执行<span style="color: #&&&&&&&&}<span style="color: #&&&&}<span style="color: #后台输出结果:
<span style="color: #<span style="color: #&--&Exception&--<span style="color: #call&catchMethod&and&return&&---&&&&<span style="color: #call&finallyMethod&and&do&something&&---&&&&false<span style="color: #3. 不抛 Exception,当 finally 代码块里面遇上 return,finally 执行完后将结束整个方法
&1&2public&static&boolean&catchFinallyTest2() {&3&&&&&&&&try&{&4&&&&&&&&&&&&int&i&=&<span style="color: #&/&<span style="color: #;&&//&不抛出&Exception&5&&&&&&&&&&&&System.out.println("i&vaule&is&:&"&+&i);&6&&&&&&&&&&&&return&true;&&&//&获得被执行的机会,但执行需要在&finally&执行完成之后才能被执行&7&&&&&&&&}&catch&(Exception&e)&{&8&&&&&&&&&&&&System.out.println("&--&Exception&--");&9&&&&&&&&&&&&return&catchMethod();<span style="color: #&&&&&&&&}finally{<span style="color: #&&&&&&&&&&&&finallyMethod();<span style="color: #&&&&&&&&&&&&return&false;&//&finally&中含有&return&语句,这个&return&将结束这个方法,不会在执行完之后再跳回&try&或&catch&继续执行,方法到此结束,返回 false<span style="color: #&&&&&&&&}<span style="color: #&&&&}<span style="color: #后台输出结果:
<span style="color: #<span style="color: #i&vaule&is&:&<span style="color: #<span style="color: #<span style="color: #call&finallyMethod&and&do&something&&---&&&&false<span style="color: #4. 不抛 Exception,当 finally 代码块里面遇上 System.exit() 方法 将结束和终止整个程序,而不只是方法
&1&2public&static&boolean&finallyExitTest() {&3&&&&&&&&try&{&4&&&&&&&&&&&&int&i&=&<span style="color: #&/&<span style="color: #;&&//&不抛出&Exception&5&&&&&&&&&&&&System.out.println("i&vaule&is&:&"&+&i);&6&&&&&&&&&&&&return&true;&&&//&获得被执行的机会,但由于 finally 已经终止程序,返回值没有机会被返回&7&&&&&&&&}&catch&(Exception&e)&{&8&&&&&&&&&&&&System.out.println("&--&Exception&--");&9&&&&&&&&&&&&return&true;<span style="color: #&&&&&&&&}finally {<span style="color: #&&&&&&&&&&&&finallyMethod();<span style="color: #&&&&&&&&&&&&System.exit(<span style="color: #);//&finally&中含有&System.exit()&语句,System.exit()&将退出整个程序,程序将被终止<span style="color: #&&&&&&&&}<span style="color: #&&&&}<span style="color: #后台输出结果:
<span style="color: #<span style="color: #i&vaule&is&:&<span style="color: #<span style="color: #<span style="color: #call&finallyMethod&and&do&something&&---&&&&<span style="color: #5. 抛出 Exception,当 catch 和 finally 同时遇上 return,catch 的 return 返回值将不会被返回,finally 的 return 语句将结束整个方法并返回
&1&2public&static&boolean&finallyTest1() {&3&&&&&&&&try&{&4&&&&&&&&&&&&int&i&=&<span style="color: #&/&<span style="color: #;&//&抛出&Exception,后续处理被拒绝&5&&&&&&&&&&&&System.out.println("i&vaule&is&:&"&+&i);&6&&&&&&&&&&&&return&true;&&&//&Exception&已经抛出,没有获得被执行的机会&7&&&&&&&&}&catch&(Exception&e)&{&8&&&&&&&&&&&&System.out.println("&--&Exception&--");&9&&&&&&&&&&&&return&true;&&//&Exception&已经抛出,获得被执行的机会,但返回操作将被 finally 截断<span style="color: #&&&&&&&&}finally {<span style="color: #&&&&&&&&&&&&finallyMethod();<span style="color: #&&&&&&&&&&&&return&false;&&//&return&将结束整个方法,返回&false<span style="color: #&&&&&&&&}<span style="color: #&&&&}<span style="color: #后台输出结果:
<span style="color: #<span style="color: #&--&Exception&--<span style="color: #<span style="color: #call&finallyMethod&and&do&something&&---&&&&false<span style="color: #6. 不抛出 Exception,当 finally 遇上 return,try 的 return 返回值将不会被返回,finally 的 return 语句将结束整个方法并返回
&1&2public&static&boolean&finallyTest2() {&3&&&&&&&&try&{&4&&&&&&&&&&&&int&i&=&<span style="color: #&/&<span style="color: #;&&//&不抛出&Exception&5&&&&&&&&&&&&System.out.println("i&vaule&is&:&"&+&i);&6&&&&&&&&&&&&return&true;&&&//&获得被执行的机会,但返回将被 finally 截断&7&&&&&&&&}&catch&(Exception&e)&{&8&&&&&&&&&&&&System.out.println("&--&Exception&--");&9&&&&&&&&&&&&return&true;<span style="color: #&&&&&&&&}finally {<span style="color: #&&&&&&&&&&&&finallyMethod();<span style="color: #&&&&&&&&&&&&return&false;&//&return&将结束这个方法,不会在执行完之后再跳回&try&或&catch&继续执行,返回&false<span style="color: #&&&&&&&&}<span style="color: #&&&&}<span style="color: #后台输出结果:
<span style="color: #<span style="color: #i&vaule&is&:&<span style="color: #<span style="color: #<span style="color: #call&finallyMethod&and&do&something&&---&&&&false<span style="color: #结语:(假设方法需要返回值)java 的异常处理中,在不抛出异常的情况下,程序执行完 try 里面的代码块之后,该方法并不会立即结束,而是继续试图去寻找该方法有没有 finally 的代码块,如果没有&finally 代码块,整个方法在执行完 try 代码块后返回相应的值来结束整个方法;如果有 finally 代码块,此时程序执行到 try 代码块里的 return 语句之时并不会立即执行 return,而是先去执行 finally 代码块里的代码,若 finally 代码块里没有 return 或没有能够终止程序的代码,程序将在执行完 finally 代码块代码之后再返回 try 代码块执行 return 语句来结束整个方法;若 finally 代码块里有 return 或含有能够终止程序的代码,方法将在执行完 finally 之后被结束,不再跳回 try 代码块执行 return。在抛出异常的情况下,原理也是和上面的一样的,你把上面说到的 try 换成 catch 去理解就 OK 了 *_* &&
阅读(53464)
&re: java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
写的非常好!清晰明了!&&&&&&
&re: java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
总结得好&&&&&&
&re: java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
顶,这篇把异常处理的很多种具体情况都列出来。学习了以后也要像博主一样积累各种细节,不断提高&&&&&&
&re: java 异常捕捉 ( try catch finally ) 你真的掌握了吗?[未登录]
如果catch里面没有return,但程序被抛出了,该如何处理呢?&&&&&&
&re: java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
&#64;大大如果有finally,就会在执行完catch之后去执行finally,如果没有程序就结束了吧。我推理的,没有写代码验证,如果你验证了,告诉我一下哈&&&&&&
&re: java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
ew2e&&&&&&
&re: java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
写的很好,很容易理解,已学习!!&&&&&&
&re: java 异常捕捉 ( try catch finally ) 你真的掌握了吗?[未登录]
给楼主赞一个&&&&&&
&re: java 异常捕捉 ( try catch finally ) 你真的掌握了吗?
挖坟了。。。搜异常再抛出时候搜到就进来看看。try catch就当做是一个另类的if else就好了。遇到异常就从try 切换到 catch里面,所以根本不会有两个return都执行到的情况。。这个finnally中的是特殊情况了。return时候和函数传参数是一样的,return对象时候,是return的引用,return基本数据类型时候,是基本数据类型的值的复制。顺序就是先try/catch的return,再finally的,finally中的return的值会覆盖之前的值。&&&&&&
随笔分类(8)
随笔档案(104)
积分与排名
阅读排行榜Java中异常的捕获顺序(多个catch)
import&java.io.IOE
public&class&ExceptionTryCatchTest&{
&&&&public&void&doSomething()&throws&IOException{
&&&&&&&&System.out.println("do&somthing");
&&&&public&static&void&main(String[]&args){
&&&&&&&&ExceptionTryCatchTest&et&=&new&ExceptionTryCatchTest();
&&&&&&&&try&{
&&&&&&&&&&&&et.doSomething();
&&&&&&&&}&catch&(Exception&e)&{
&&&&&&&&&&&&//
&&&&&&&&}&catch&(IOException&e)&{
&&&&&&&&&&&
问题:上述程序能否编译通过?为什么?
解答:不能编译通过。因为编译的时候会报错:已捕捉到异常 java.io.IOException。&
catch(IOException e)这句有错误。
分析:对于try..catch捕获异常的形式来说,对于异常的捕获,可以有多个catch。对于try里面发生的异常,他会根据发生的异常和catch里面的进行匹配(怎么匹配,按照catch块从上往下匹配),当它匹配某一个catch块的时候,他就直接进入到这个catch块里面去了,后面在再有catch块的话,它不做任何处理,直接跳过去,全部忽略掉。如果有finally的话进入到finally里面继续执行。换句话说,如果有匹配的catch,它就会忽略掉这个catch后面所有的catch。对我们这个方法来说,抛出的是IOException,当执行etct.doSomething();时,可能会抛出IOException,一但抛出IOException,它首先进入到catch
(Exception e) {}里面,先和Exception匹配,由于OExceptionextends
Exception,根据多态的原则,IOException是匹配Exception的,所以程序就会进入到catch
(Exception e) {}里面,进入到第一个catch后,后面的catch都不会执行了,所以catch (IOException
e) {}永远都执行不到,就给我们报出了前面的错误:已捕捉到异常 java.io.IOException。
总结:在写异常处理的时候,一定要把异常范围小的放在前面,范围大的放在后面,Exception这个异常的根类一定要刚在最后一个catch里面,如果放在前面或者中间,任何异常都会和Exception匹配的,就会报已捕获到...异常的错误。
转自:JavaEye
已投稿到:try 语句块可以没有catch 子句,不是吗?
try 语句块可以没有catch 子句,不是吗?
好哒,谢谢了昂~
写下你的评论...
好的,谢谢了昂~
写下你的评论...
Copyright (C)
All Rights Reserved | 京ICP备 号-293被浏览3220分享邀请回答ASP.NET中涉及数据库的异常因为安全考虑就不能随便抛给用户,而输入验证反而适合throw异常给调用方处理至于“try catch 隐藏了bug”这个说法,只是try...catch滥用导致的后果,很多刚入门的开发者还没调试就搞个try...catch一套,然catch里不是return null就是return 0,一个一级调用里套一个try...catch,好像没报错就万事大吉了一样,这样隐藏了bug但没有解决bug,写了try...catch还不如不写。最后实际运行的时候没返回理想的结果也不知道那个环节出了问题要用好try...catch首先得对“异常”理解到位,还是引用《C#语言规范》:C# 中的异常用于处理系统级和应用程序级的错误状态,它是一种结构化的、统一的和类型安全的处理机制。理解异常主要是三个方面:首先,它就是个结构化的继承自System.Exception的类,只有遇到throw或catch才表现特殊,不同子类型区分不同异常认识常见的系统内置的异常,比如NullReferenceException,光System命名空间下就有50几个
既要会catch异常又要会throw异常,这个下面细说会catch异常主要是:首先能大概预估到会出现什么异常,既然是异常必然发生自不稳定因素,比如文件IO、网络IO、跟其他程序交互(包括跟操作系统的交互)、数据库操作(数据库操作一般是前三者的组合)等,鉴于.NET本身的安全设计,只需要CPU、内存的操作往往不大会出异常比如处理个字符串(这类操作出异常可能CPU或内存问题,那时候.NET还能不能运行都不一定,在程序内处理异常帮不上什么忙,另外不要提什么数值溢出的异常,那是没做输入验证的问题)。异常没出现就先在脑子有概念这是很好的编程习惯
了解为什么要catch异常,主要是对用户友好、隐藏敏感信息(比如数据库连接字符串)、增强稳定性(比如对于某些不稳定的操作catch之后再重试几次)、记录日志以便在不能调试的时候获取异常信息(多说一句,记录日志不光是记录Message,堆栈信息和相关输入参数很重要)。前面说“try catch 隐藏了bug”其实是很多人把对用户友好跟对开发者友好等价了,认为对用户应该返回友好信息,对调用方程序或者开发者也应如此,其实对开发者真正有用的就是异常信息,而且是详细的异常信息,异常信息就是程序与程序之间、开发者与开发者之间针对意外情况的交流机制然后是针对不同的异常使用不同的策略,比如数据库异常是返回null?还是抛出给调用方处理?还是重试一下?这得根据上条和具体的业务逻辑来定最后,大部分开发平台都内建了最高层的异常处理事件,比如Winform有Application.ThreadException事件、webform可以在Global.asax中写Application_Error、webform还有Page_Error事件、MVC中可以通过Fitler机制实现,也就是说代码中除非要特殊处理的才用catch,尚未预计到的bug都可以通过这些异常处理事件捕获,而不用到处写try...catch,捕获之后根据异常信息再进一步处理,这样一步步减少异常出现会catch之后就需要会throw,主要是:用在输入验证,比如email格式不对可以返回异常给调用方,至于调用方给用户怎么处理那是另一回事儿了,这在分层架构中很重要
返回catch的异常,主要是catch异常之后可能需要直接throw或包装之后再throw,之所以需要catch是需要其他操作比如记录日志,但是结合上面第4条,这个操作应该尽量少,除非是安全或是其他方面考虑try的成本是很高的,应该避免滥用try,再就是catch和finally中的语句要尽量简短、快速,还要避免catch中在引发新的异常,比如记录日志的时候出现IO异常
总结一下:
异常是一种程序间的沟通机制,要善用catch和throw,但不能滥用
try...catch是捕捉以便及时处理的机制,如果你捕捉了而没有进行什么及时的、实效性的处理,那还是放过让别人处理吧,不要假装自己处理了,出了问题别人还是会找来的,当这个别人就是你自己的时候,让异常出现在一处比散落在各处要好得多
try...catch只能捕捉异常而不能解决异常,异常最终还是得靠开发者自己解决,所以在写程序时出错就够了,不要在用try...catch还给自己挖坑随手一写,有问题欢迎评论,尽量完善--------2017年7月更新-----最近发现了一个知乎问答:关于「任其崩溃」思想的,也就是不处理异常让它直接暴露出来,里面有大牛的很多回答也是关于处理异常的,推荐对异常处理困惑的同学看下3012 条评论分享收藏感谢收起73 条评论分享收藏感谢收起所有回答(4)
在action的方法上加 throws xxException?这样就不用try catch了,除非你有一个必要的Exception需要在catch里面处理
园豆:1219
园豆:1219
园豆:1219
园豆:1219
园豆:1219
园豆:1219
当然不是。我的处理方法是只在明确知道可能会有异常发生,并且需要处理,并且知道怎么处理的时候,才去try异常并进行处理。
园豆:24265
园豆:24265
园豆:24265
园豆:24265
这儿异常的处理需要根据你的具体情况分析
如果你的程序只是想让异常不抛出 不要让外部知道 那么统一提示程序错误就好了
如果你的程序想让用户按照异常的信息 进行操作 那么需要根据errormesserage 来弹出&
至于捕获的地方 在顶级应用程序捕获就好了 一般都会有一个全局的error事件
在里面捕获异常即可&
要注意的地方有 抛出异常的位置 需要指定异常的类型
例如 exceptionlog 这种异常 只是记录日志
exceptionStop 这种异常 中断程序&
不然捕获异常的位置 无法根据不同的异常进行不同的处理
园豆:2766
园豆:2766
既然service层发生异常。直接在service层抛出。没必要往action抛了。就近处理
&&&您需要以后才能回答,未注册用户请先。

我要回帖

更多关于 c try catch 的文章

 

随机推荐