catch里写throw,用处是什么?

sd4324530 2011-12-26 05:20:30
在catch里再次throw出去一个异常,这种写法有什么用?如果需要将异常向上抛,那么在方法的后面直接throws不就好了吗?
请大牛们详细的解释下。。。
或者说这种写法好不好呢?
个人的看法是偏向不好,请指教
...全文
2825 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq1392913342 2011-12-29
  • 打赏
  • 举报
回复
因为在SocketException 块中并不知道是网络原因关闭的连接还是超时后强制关闭的连接。所以在SocketException块里判断是不是超时引起的异常。。是就抛出TimeOutException 。用于业务判断与处理。
qq1392913342 2011-12-29
  • 打赏
  • 举报
回复
有用!比如Socket的时候。为了节省资源限制Socket线程的最长连接是10分钟。如果10分钟内这个Socket请求还不处理完毕就限制关闭Socket.

public void run() {
timer.schedule(new MyTimeOutTask(),threadTimeOut);
out.println("200 ESMTP Service ready");
try {
while(true){
String line=in.readLine();

if(line==null) break;
if(line.equalsIgnoreCase("QUIT")){
out.println("221 Bye");
break;
}else if(line.equalsIgnoreCase("NOOP")){
out.println("200 OK");
}
System.out.println("client say:"+line);
}
} catch(SocketTimeoutException e){
System.out.println("ERROR : Read timed out");
//e.printStackTrace();
}catch(SocketException e){
if(isTimeOut){
throw new TimeOutException("运行超时!");
//System.out.println("超过连接的最长限制!");
}else{
e.printStackTrace();
}
} catch (IOException e) {
e.printStackTrace();
}finally{
timer.cancel();
timer=null;
close();
}
}


在线程超时的时候强行关闭Socket则 while中 的in.readLine();会抛出SocketException 不会抛出TimeOutException ..所以在 SocketException的catch里判断是不是超时(isTimeOut=true)是则抛出TimeOutException 不是就处理SocketException
gmowker 2011-12-29
  • 打赏
  • 举报
回复

不是这样的,catch到的可能是sun提供的,比如越界异常
但是我可以在后面抛出一个我自定义的异常,比如告诉用户,是在a模块的输入异常。
如果在另外一个地方也有越界异常,我可能抛出的是b模块输入异常。

[Quote=引用 5 楼 sd4324530 的回复:]

引用 3 楼 anhy 的回复:

封装成自定义业务异常类


封装自己的异常类我知道,可是如果需要抛出自己的异常类,catch后的参数上写上不就可以了吗?干嘛要在catch里额外throw出来呢?
[/Quote]

--------------------
http://www.qinglobo.com/list-6.htm
Jobernowl 2011-12-28
  • 打赏
  • 举报
回复
作用是把程序退出 自定义异常显示之类的吧 在手机上千万不能抛出异常 不然就会退出
sd4324530 2011-12-28
  • 打赏
  • 举报
回复
在catch里再次throw出去一个异常,我觉得这种情况可能会用到:
自己写一套API,API中某些方法是需要捕获异常的,在封装好的API中catch一次,做一些处理。
但是这样用户在调用这个方法的时候,就不需要捕获了,但是此方法是有可能出异常的,而用户却不能在异常出现时进行处理。所以,在catch处需要再次throw一次异常,这样,用户也就可以进行一些异常处理了。
也可以这样作比喻,不知道合不合理:
如果在catch里不throw,那么就好比把捕获异常的权利私有化了(private),用户调用时,无权捕获;
而在catch里再次throw异常,那么好比将捕获异常的权利公有化了(public),可以供用户使用。
sd4324530 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yktd26 的回复:]

用处是,在实现自身异常处理的同时告知调用方此异常的发生,并允许调用方可以捕获和处理此异常

这可以将每一层的异常处理分层整合。处理

有没有用可能得根据情况所定吧

比如说一套lib有自己的logger,那在自己的catch中以自己的方式log异常,之后也需要通知调用者此处出现异常,所以throw给调用方
[/Quote]
在catch里再次throw出去一个异常,我觉得这种情况可能会用到:
自己写一套API,API中某些方法是需要捕获异常的,在封装好的API中catch一次,做一些处理。
但是这样用户在调用这个方法的时候,就不需要捕获了,但是此方法是有可能出异常的,而用户却不能在异常出现时进行处理。所以,在catch处需要再次throw一次异常,这样,用户也就可以进行一些异常处理了。
也可以这样作比喻,不知道合不合理:
如果在catch里不throw,那么就好比把捕获异常的权利私有化了(private),用户调用时,无权捕获;
而在catch里再次throw异常,那么好比将捕获异常的权利公有化了(public),可以供用户使用。
sd4324530 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yktd26 的回复:]

用处是,在实现自身异常处理的同时告知调用方此异常的发生,并允许调用方可以捕获和处理此异常

这可以将每一层的异常处理分层整合。处理

有没有用可能得根据情况所定吧

比如说一套lib有自己的logger,那在自己的catch中以自己的方式log异常,之后也需要通知调用者此处出现异常,所以throw给调用方
[/Quote]
在catch里再次throw出去一个异常,我觉得这种情况可能会用到:
自己写一套API,API中某些方法是需要捕获异常的,在封装好的API中catch一次,做一些处理。
但是这样用户在调用这个方法的时候,就不需要捕获了,但是此方法是有可能出异常的,而用户却不能在异常出现时进行处理。所以,在catch处需要再次throw一次异常,这样,用户也就可以进行一些异常处理了。
也可以这样作比喻,不知道合不合理:
如果在catch里不throw,那么就好比把捕获异常的权利私有化了(private),用户调用时,无权捕获;
而在catch里再次throw异常,那么好比将捕获异常的权利公有化了(public),可以供用户使用。
sd4324530 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 yin_slin 的回复:]

用于抛出用户容易理解的异常而不是底层的异常。这个在spring体现得淋漓尽致。例如,如果系统使用hibernate,ibatis,jdbc中的某一种,那么他们抛出的数据库异常信息就各不相同,如果客户或开发员只熟悉其中一种,那其他两种的异常就很难看懂,spring把这三种数据库连接可能抛出的异常,重新统一封装了,那么,我们只要了解spring的异常信息就可以了,不需要关心底层用的是哪种ORM,即使……
[/Quote]

受教了,还没研究过spring的源码,看来得抽时间看看了
密码测试 2011-12-28
  • 打赏
  • 举报
回复
用于抛出用户容易理解的异常而不是底层的异常。这个在spring体现得淋漓尽致。例如,如果系统使用hibernate,ibatis,jdbc中的某一种,那么他们抛出的数据库异常信息就各不相同,如果客户或开发员只熟悉其中一种,那其他两种的异常就很难看懂,spring把这三种数据库连接可能抛出的异常,重新统一封装了,那么,我们只要了解spring的异常信息就可以了,不需要关心底层用的是哪种ORM,即使换成我们不熟悉的也没关系。
yorkinchai 2011-12-28
  • 打赏
  • 举报
回复
很多网上的开源包里的异常信息都不甚明了,如果我要用比较详细的信息来抛异常,那么可以将这些开源包重新修改编译,但这样做属于侵入性行为,因此我们可以继承这些类(如果可以继承),然后在子类中将异常捕获,重新抛出对应的自定义异常
龙四 2011-12-27
  • 打赏
  • 举报
回复
火龙果所言极是
放纵青春 2011-12-27
  • 打赏
  • 举报
回复
throw是指抛出的一个具体的异常类型。
通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。
throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法;
throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后再将包装后的异常信息抛出。
对异常处理方式不同.throws对异常不处理,谁调用谁处理,throws的Exception的取值范围要大于方法内部异常的最大范围,而cathch的范围又要大于throws的Exception的范围;throw 主动抛出自定义异常类对象. throws抛出的是类,throw抛出的是对象.
在方法定义中表示的是陈述语气,第三人称单数,throw 显然要加s。(throws 一般用作方法定义的子句)
在函数体中要用throw,实际上是祈使句+强调,等价于DO throw ....,do +动词原形

throw 用于引发异常,可引发预定义异常和自定义异常
西部流云 2011-12-27
  • 打赏
  • 举报
回复
catch(Exception e)
{
throw new MyException("抛出我自己的异常");
}

括号里面是说你要捕获哪个异常

大括号里面的throw是说你捕获到了异常,准备怎么抛出。是跑出捕获的异常,还是抛出其他异常等等。
liayin 2011-12-27
  • 打赏
  • 举报
回复
通常自定义异常需要自己引抛出
qq931226110 2011-12-27
  • 打赏
  • 举报
回复
throw在 java中是关于异常的操作.
首先异常在java中的意思是: 一些可以导致程序出问题的因素,比如书写错误,逻辑错误或者是api的应用错误等等. 为了防止程序的崩溃就要预先检测这些因素,所以java 使用了异常这个机制.
在java中异常是靠 "抛出" 也就是英语的"throw" 来使用的,意思是如果发现到什么异常的时候就把错误信息 "抛出",
throw写在方法体内
throws写在方法名的后面
两个都是用于抛出异常
李聪成 2011-12-27
  • 打赏
  • 举报
回复
让调用这个方法的上一层捕获,把异常转移给上一层
gengchenhui 2011-12-26
  • 打赏
  • 举报
回复
抛出异常机制是这样:比如说你在业务层的catch里面throw这样写:throw new Exception(“您的权限不够”);然后在最上层(就是UI层)直接这样

try{}catch(Exception ex){
MessageBox.Show(ex.Message);}
就行了,不必去管这个ex的消息是什么,异常机制本来就是底层抛出,上层捕获的,只不过现在不用你自己去根据不同类型异常去写异常信息了。
ps:这是我自己的理解,仅供参考。。。
  • 打赏
  • 举报
回复
1:记录一下日志
2:将 checked 异常包装成 unchecked 异常

其他我也想不出有什么原因了。
yktd26 2011-12-26
  • 打赏
  • 举报
回复
用处是,在实现自身异常处理的同时告知调用方此异常的发生,并允许调用方可以捕获和处理此异常

这可以将每一层的异常处理分层整合。处理

有没有用可能得根据情况所定吧

比如说一套lib有自己的logger,那在自己的catch中以自己的方式log异常,之后也需要通知调用者此处出现异常,所以throw给调用方

朝花夕拾 2011-12-26
  • 打赏
  • 举报
回复
当然有用。

比如自己定义很多业务异常类。。当你的问题是属性业务逻辑,或者数据不对时,catch以后,抛出你的业务异常,在上一层进行捕获,进行不同的处理
加载更多回复(7)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧