项目中使用 sip-servlets-impl-2.0.0.FINAL.jar 出现卡死问题,检查了一下是由于抛出了一个异常没有捕获,问题是这个异常是 Runtime 的:
使用的 jar 里面关键方法大致如下:
org.mobicents.servlet.sip.message.SipServletRequestImpl#createResponse(int, java.lang.String, boolean){
try {
...
if(xx) throw new IllegalStateException("blala");
...
}catch (ParseException ex) {
throw new IllegalArgumentException("Bad status code " + statusCode,
ex);
}
}
然而现在,我能怎么办,必须对这两个运行时异常进行 try catch 了吗?
1
GuuJiang 2017-10-28 15:49:40 +08:00 via iPhone
为什么要强调“问题是这个异常是 Runtime 的”,莫非你以为运行时异常就不用 /不能捕获?
|
2
hqtc OP 运行时异常不是不建议捕获处理的吗。。。
觉得抛出运行时异常这个行为就很诡异啊,因为外部调用的时候不强制要求捕获处理,外部调用者根本不知道你里面到底抛了几个异常 |
3
hqtc OP @GuuJiang 运行时异常不是不建议捕获处理的吗。。。
觉得抛出运行时异常这个行为就很诡异啊,因为外部调用的时候不强制要求捕获处理,外部调用者根本不知道你里面到底抛了几个异常 |
4
hujianxin 2017-10-28 16:54:19 +08:00 4
运行时异常,不建议捕获处理,而是建议避免发生运行时异常,出现运行时异常,说明你的输入肯定是不符合库作者的约定的,所以说,如果按照库的要求约定来写代码就不会发生了。
举几个例子: 1. 假如一个方法要求不能输入 null,但是他没法强制你不输入 null,但是可以在方法开头加上判断,如果输入时 null,则抛出运行时异常。 2. java 迭代器运行过程中不允许修改集合内容,但是他没法强制你不修改,但是他在迭代的过程中会判断,如果你修改了,则抛出运行时异常。 3. wait notify 必须用在 synchronized 块中,但是作者没法强制你每次都正确的使用,但是他会判断你的 wait 方法调用是否放入 synchronized 中,如果没有放入,那么会抛出运行时异常。 所以运行时异常,时作者使得程序正常运行的一种约定,你如果不按约定来,那么他会就抛出运行时异常,你按照约定来,那么就没问题 |
5
haozhang 2017-10-28 17:27:59 +08:00 via iPhone
异常除了运行时抛出还能在什么时候抛出?外面包一层 try catch。
|
6
hqtc OP @hujianxin 有道理额,所以感觉还是分析调用方法的数据和参数。。。但是尼玛是多线程的,程序运行了许久只在昨天出现了一下,也没记得是哪个线程给的数据不对。。。难搞
|
7
sorra 2017-10-28 19:00:17 +08:00
@hqtc 要不要 catch 的唯一标准是这个异常你要不要处理 /要不要 let it crash
记录错误信息的最好方式是打个 log,打出 stack trace 和线程名 /请求编号、用户 id 等信息,越全越好 |
8
hsuan 2017-10-28 19:57:18 +08:00 via Android
运行时异常还是不要 catch 的好,一般运行时异常表示出现了无法恢复的严重错误,你就算 catch 了也跑不下去。
|
9
skydiver 2017-10-28 20:06:08 +08:00 via Android
要么是你写错了,直接改代码修正错误
要么是库的 bug,给他们提 bug report |
11
zhx1991 2017-10-28 23:42:07 +08:00
运行时异常当然要捕获
很简单的例子, 比如接收到一个 json 串转换为自定义对象, 这个转换要是错误抛出的异常就是运行时异常 至少捕获打个日志啊 |
12
esmdxx1 2017-10-29 09:48:15 +08:00 via iPhone
|
13
shibingsw 2017-10-29 10:44:57 +08:00
多半是你的代码有 bug。
|