(本文是http://www.xia7.com/Html/bcyy/Java/2006_03_20_10_174.html的梗概)
以下是一段代码代码:
1 OutputStreamWriter out = ...
2 java.sql.Connection conn = ...
3 try { // ⑸
4 Statement stat = conn.createStatement();
5 ResultSet rs = stat.executeQuery(
6 "select uid, name from user");
7 while (rs.next())
8 {
9 out.println("ID:" + rs.getString("uid") // ⑹
10 ",姓名:" + rs.getString("name"));
11 }
12 conn.close(); // ⑶
13 out.close();
14 }
15 catch(Exception ex) // ⑵
16 {
17 ex.printStackTrace(); //⑴,⑷
18 }
在上面这段代码中,出现了初学者经常遇到不适当的异常处理方法。其实,这段代码也或多或少在我们的系统中出现,只是并没有意识到有什么不当。
作者根据这段代码,总结出六个反例:
1、丢弃异常:R17中,并不对异常进行实质性处理,仅采用printStackTrace(),这在调试期间是可以的,但在调试结束后,就不应该再这样使用了。处理办法:1)处理异常,例如修正问题,提醒某人进行处理;2)重新抛出异常;3)转换异常,通常是转换到应用级的容易被用户理解的异常;4)不捕获异常;
2、不指定具体异常。
3、不释放资源。
4、不说明异常的详细信息。
5、过于庞大的try块,同时捕捉多个异常,却难以确认异常来源。
6、输出数据不完整。例如:在循环中出现异常,则显然不能输出完整的信息。
改写后的代码:
OutputStreamWriter out = ...
java.sql.Connection conn = ...
try {
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery(
"select uid, name from user");
while (rs.next())
{
out.println("ID:" + rs.getString("uid") + ",姓名: " + rs.getString("name"));
}
}
catch(SQLException sqlex)
{
out.println("警告:数据不完整");
throw new ApplicationException("读取数据时出现SQL错误", sqlex);
}
catch(IOException ioex)
{
throw new ApplicationException("写入数据时出现IO错误", ioex);
}
finally
{
if (conn != null) {
try {
conn.close();
}
catch(SQLException sqlex2)
{
System.err(this.getClass().getName() + ".mymethod - 不能关闭数据库连接: " + sqlex2.toString());
}
}
if (out != null) {
try {
out.close();
}
catch(IOException ioex2)