今天看到的一个问题,顺便总结如下:
Java编程中,程序异常处理是一个跑不掉的东西。
对于同步编程:
调用某个可能抛出checked或unchecked异常的方法时,可以直接在方法中声明throws继续往上处理,也可以在本方法中进行try catch处理(比如进行日志登记)。
catch处理后,是否进行throw e或throw new XxxException(e)视具体情况而定。这些处理,从技术上都是正确的,我们也处理地很好。问题不在这。
对于异步编程(重点):
在线程A中,从底层的Thread.run一直运行调用到某个方法xxx(),xxx()设置线程之间的共享对象并notify通知另外一个线程B处理输入的任务,
如果任务失败时 (比如验证错误、程序空指针错误、超时错误等等)
这样情况下,通常按照以下判断程序的好坏:
1、 差的做法:A线程无法收到失败通知,也就是B线程产生的异常对象无法通知到A,使A无法接收该异常;
2、 好的做法:B的异常能够被A接收到!技术上是B发生异常时,要把异常记录到某共享对象,然后B线程通知A线程取回该异常。
但,xxx()获取到B的异常后,如何处理呢?分为3种情况:
1、 xxx() 自己try catch处理掉 — 没问题,如果真的应该由它处理的话
2、xxx() 需要把这个异常rethrow出去给上级调用者,
此时要注意了,请不要简单这样写throw exceptionFromThreadB; 而应该写成这样:throw new XxxException(exceptionFromThreadB);
3、 如果第1步的try catch中需要做logger.error记录,也请这样记录logger.error(“”, new XxxException(exceptionFromThreadB));,不写成logger.error(“”, exceptionFromThreadB);
为什么?
一个异常对象,意味着JVM dump出的当时的堆栈调用情况。throw 或rethrow出去的意味着,让上级了解当时这个堆栈。
如果只是throw/log.error exceptionFromThreadB,那么从后台的日志文件中,并不能看出原来是xxxx()这个方法进行异步调用发生的异常,更不知道是xxx()里面的具体哪一个步骤、哪一个代码调用的异步调用。
这会耽误程序的调试,问题的解决。
rethrow或log异常的同学多留意一下
分享到:
相关推荐
var rethrow = require ( 'rethrow' ) ; 有关用法示例,请参见。 原料药 在上下文中将给定的err重新抛出给给定lineno filename中有问题的模板表达式。 参量 err {Error} :错误对象 filename {String} :模板的...
将异常抛出另一个异常。 将异常抛出到catch中-相同的异常。 抛出异常到catch中-两种不同的异常。 将日志错误扔到catch中。 将日志错误扔到catch中。 用法 使用Eclipse运行它。 添加到vm参数:-agentlib:...
设计怪癖目的是提供一个主要尝试保证非阻塞执行的API,以支持针对诸如网络I / O之类的任务进行异步编程。 一切都是 我们从大多数成员函数中返回shared_from_this()进行链接。 将来可能会改变。 错误处理使用异常或...
linux下使用nodejs 连接数据库mysql
Testcase for proper handling of rethrow.
要在编译时检测问题,请参阅 。 动机 SLF4J 是很有用的日志门面,但有时我们会错误地使用。 你能在下面的课中发现错误吗? 尤其是在庞大的产品中,这并不容易,这个 FindBugs 插件将帮助您找到。 class Foo { ...
The entire Java language, including Java 7-specific features such as switch on string, try-with-resources, final rethrow, multicatch, and SafeVarargs A huge assortment of Java 7 APIs, beginning with ...
支持选项rethrow: true | false; // rethrow catched errorverbose: true | false; //show verbose logreporter: String; //report function name, which should be globally accessed. default name is ...
当未定义模板变量时(例如上例中的<%= b %> ,而不是得到一条神秘的错误消息并浪费时间进行调试,您可以得到: 相关项目 :重新抛出错误以获得更好的模板错误报告。 | 运行测试 安装开发人员依赖项: $ npm...
不幸的是,当在 try-catch 块的 catch 子句中重新抛出错误时,Matlab 不会显示错误的位置。 这可能非常令人沮丧,因为错误可能存在于可能不熟悉的代码中的多个级别。 DISPERROR 将显示最后一个错误的错误消息,连同...
// 调用基类成员函数;内联函数(in-line) #include #include using namespace std; class child { protected: char name[20]; int age; public: child(); child(char *n,int a); void ask(char *n); void ...