public void deleteDep() {
try {
command="delete from department where dep_name='"+Dep_Name+"';";
sqlcon.setCommand(command);
sqlcon.getDelete();
Mes=sqlcon.getResultMessage();
status=true;
}
catch(Exception ex) {
status=false;
Mes=ex.getMessage();
}
}
以上是一个类的方法,在调用这个方法后,抛出一个异常,但是status的值仍然为true,但Mes却附上了新值;
是为什么呀,帮忙解决下.谢谢
| perryhg 回复于:2005-05-07 03:58:49
| 可能异常已经被你在sqlcon.getResultMessage(); 里面截获了,没有被抛到外面来.举例如下:
[code:1:2a03bf508d]
methodA()
{
try{
xxx
}catch(XXXException e){
//System.out.println(e.getMessage());
//Exception 在这里被截获
}
}
try{
opt.methodB();//这个可能产生exception
opt.methodA()
}catch(Exception e){
//由于methodA() 产生的Exception已经在methodA内部被截获,
//所以这里永远也catch不到methodA产生的Exception
}
[/code:1:2a03bf508d]
两种解决办法:
一种是修改methodA()取消try,增加throw定义
[code:1:2a03bf508d]methodA() throws XXXException {
xxx;
}[/code:1:2a03bf508d]
但是这样修改工作量太大,尤其是要去除try{}...会造成代码排列很混乱,难以阅读,当然,如果你有Eclipse之类的开发工具可以做一个reformat就好了,但还是很麻烦,这里有一个简单的解决办法:在原来的catch里面增加throw, 在方法定义里面加上throw[b:2a03bf508d]s[/b:2a03bf508d] 注意throw和throw[b:2a03bf508d]s[/b:2a03bf508d]的不同
methodA() [b:2a03bf508d]throws XXXException[/b:2a03bf508d] {
try{
xxx
}catch(XXXException e){
//you may wish to write some log here
//logger.warning(e.getMessage());
[b:2a03bf508d]throw e;[/b:2a03bf508d]
}
这样代码的修改量小,又灵活
| | whucspanda 回复于:2005-05-07 09:09:49
| 谢谢了,
确实如此,异常在里面已经截获.
对JAVA不熟,用它来做东西好辛苦呀
| | perryhg 回复于:2005-05-07 18:44:02
| 异常处理并不是java的首创,在c++里面就已经有了,后来的.net里面也引入了这个概念,刚开始使用是觉得很不习惯,但是一旦你理解了,他的功能非常强大,非常灵活,不是所有异常都需要处理,有些异常是关键的,需要立即处理,有些异常是非关键的,可以略过,Exception结构允许你灵活得控制。一个常见的例子是用jdbc:
[code:1:c7156932d4]try{
class.forName(....);
Connection conn = DriverManager.getConnection(...);
String sql;
sql = "insert into...";
Statement stmt = conn.prepareStatement(sql);
try{
while(somecondition)
stmt.setString(1, a);
stmt.setInt(2, b);
stmt.execute();
}catch(SQLException e){
System.out.println("参数有误: a= "+a+" b="+b);
//sql execution error
//maybe some parameter a or b has problem
//you don't want to stop the insert
//so catch the exception here don't throw
}
}catch(XXXException e){
// 除了SQL执行过程中的Exception以外,其他的Exception都到这里来
//比如jdbc Driver找不到,数据库联接不上等等
//一旦发生此类Exception,就直接跳出try
//逻辑很简单,数据库都联接不上,就不需要再执行SQL了,
//免得发生更多的莫名其妙的错误。
}[/code:1:c7156932d4]
这个例子发生在大规模外部数据导入的时候,如果提供的数据中有个别数据不符合规范(比如,和其他数据重复,或者超出数据库规定的长度等等),用exception处理可以先略过这些数据,以后再处理。
用Exception处理可以把错误很容易得定位到它原始发生的地方以避免到处发生错误而难以追踪。
Exception的另一个特别的高级用处是资源清理。有时候比如你打开了数据库联接,或者进行事物处理(transaction)的时候,对发生的Exception,可以进行一些特别处理。
dbconnect = getConnect();
try{
...
}catch(XXXException e){
//do something
}finally{
[b:c7156932d4]dbconnect.close();[/b:c7156932d4]
}
这样,就是不管你有没有发生exception,用完数据以后到保证connection被关闭。这个在多线程,特别是web编程分方面特别有用,如果你不显式进行关闭,这个连接可能会被保持一个小时左右timout以后再被关闭,这样一来就造成访问高峰的时候打开了很多连接打开造成服务器资源耗尽。
有的时候,你可以创建自己的Exception,举例:
由于创建数据库连接从loaddriver开始要发生好几个Exception,我不想每次后面都catch一大堆Exception,因为这里我不关心是什么错,我只要知道数据库能否打开就可以了,我就自己创建了DBConnException,
[code:1:c7156932d4]public class DBConnException extends Exception {
public void DBConnException (e)
{
super(e);
}
}[/code:1:c7156932d4]
把所有初始化数据库连接发生的Exception都用DBConnException包起来。
[code:1:c7156932d4] public void open() throws DBConnException {
try {
try {
initDBConn();
} catch (ClassNotFoundException e) {
throw new DBConnException(e);
} catch (InstantiationException e) {
throw new DBConnException(e);
} catch (IllegalAccessException e) {
throw new DBConnException(e);
} catch (SQLException e) {
throw new DBConnException(e);
}
} catch (DBConnException e) {
close();
throw e;
}
}[/code:1:c7156932d4]
调用的时候就简单了,把连接数据库的功能封装了一个类:
DBConnection,每次我创建的时候
DBConnection dbconnect = new DBConnection(properties);
try{
dbconnect.open();
}catch(DBConnException e){
//catch一个Exception就够了,而不用catch一大堆。
}finally{
dbconnect.close();
}
| |
|