社区
Java SE
帖子详情
catch里写throw,用处是什么?
sd4324530
2011-12-26 05:20:30
在catch里再次throw出去一个异常,这种写法有什么用?如果需要将异常向上抛,那么在方法的后面直接throws不就好了吗?
请大牛们详细的解释下。。。
或者说这种写法好不好呢?
个人的看法是偏向不好,请指教
...全文
2825
28
打赏
收藏
catch里写throw,用处是什么?
在catch里再次throw出去一个异常,这种写法有什么用?如果需要将异常向上抛,那么在方法的后面直接throws不就好了吗? 请大牛们详细的解释下。。。 或者说这种写法好不好呢? 个人的看法是偏向不好,请指教
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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:这是我自己的理解,仅供参考。。。
火龙果被占用了
2011-12-26
打赏
举报
回复
1:记录一下日志
2:将 checked 异常包装成 unchecked 异常
其他我也想不出有什么原因了。
yktd26
2011-12-26
打赏
举报
回复
用处是,在实现自身异常处理的同时告知调用方此异常的发生,并允许调用方可以捕获和处理此异常
这可以将每一层的异常处理分层整合。处理
有没有用可能得根据情况所定吧
比如说一套lib有自己的logger,那在自己的catch中以自己的方式log异常,之后也需要通知调用者此处出现异常,所以throw给调用方
朝花夕拾
2011-12-26
打赏
举报
回复
当然有用。
比如自己定义很多业务异常类。。当你的问题是属性业务逻辑,或者数据不对时,catch以后,抛出你的业务异常,在上一层进行捕获,进行不同的处理
加载更多回复(7)
ignor:有条件地忽略异步和promise函数中的错误并返回默认值
点火器 有条件地忽略异步/承诺函数中的错误,并返回默认值。 概要 import * as ignore from "ignor" ; await got ( url ) .
cat
ch
( ignore . code ( "ECONNREFUSED" , "default value" ) ) ; 其他用途 // Ignore an error with a code and return undefined. Otherwise
throw
error. ignore . code ( "ECONNREFUSED" ) ; // Ignore an error with a code and return default value. ignore . code ( "ECONNREFUSED" , "no content" ) ; // Ignore an error with mul
Javascript中的关键字和保留字整理
ECMA-262中描述了一组具有特定用途的关键字,可用于表示控制语句的开始或结束,或者用于执行特定操作等。规定:关键字属于语言保留,不可以用于标示符。 ECMAScript的全部关键字(*为第五版新增): break do instanceof typeof case else new var
cat
ch
finally return void continue for swit
ch
while debugger* function this with default if
throw
delete in try ECM
try
cat
ch
/
throw
js错误处理和异常调试 查看报错 F12调出控制台 错误的处理 try
cat
ch
一旦发生错误,程序就终止执行了。但是js提供try-
cat
ch
结构,允许对错误处理。 try{
throw
new Error('出错');//中断程序,抛出错误 }
cat
ch
(e){ console.log(e.name+":"+e.message); console.log(e.stack); } //Error: 出错 // at <anonymous>:2:11 try代码块抛出错
try
cat
ch
return 问题及
throw
异常-try
cat
ch
return问题及
throw
JAVA异常 try..
cat
ch
方法
throw
和
throw
s 自定义异常
异常 try…
cat
ch
方法
throw
和
throw
s 自定义异常 这部分的笔记几乎是没做任何整理,直接把课上的笔记和教材照搬进来,可做的练习也很少。只要会try…
cat
ch
方法,明白异常和异常抛出是个怎么回事就行… 异常 在java程序,出现了不正常或错误的情况,称为异常 异常就是一个对象,描述一些不正常的情况信息:异常的原因,位置,类型 异常也是一种处理机制,我们可以对异常进行捕获处理,或者结束程序 出现了错误,必须修改源代码,出现了异常,可以捕获 异常的体系
Throw
able: 可以抛出,是
Java SE
62,614
社区成员
307,327
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章