异常处理的常见问题

(本文是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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值