论坛首页 Java企业应用论坛

关于异常的处理以及相关设计

浏览 12700 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2006-12-27  
异常是接口的一个约定,相比起返回值的方式,异常具有更加明确的业务含义。
返回值只是一种强制的约定,业务含义是含糊的,异常是非常明确的。
比如:
interface Person {
Age getAge() throws AskLadyException;
}
这样的接口设计,意义就很明确。返回null表示“我不知道”,抛出异常表示“你不该问”。
0 请登录后投票
   发表时间:2006-12-27  
楼上的说的很好。我一直想说这些,但是我表达不出来
受教了。
0 请登录后投票
   发表时间:2006-12-28  
出了错就抛runtime,一般不要用返回值,否则会很ym的
可能出错就throws runtime (具体如lane_cn所言)
最重要的一点就是不要淹没异常,对于check的你可以rethrow(因为俺讨厌异常链,到后面不仅冗长,而且根本就没什么主义了)

异常style可参考http://www.javalobby.org/java/forums/t82979.html
0 请登录后投票
   发表时间:2006-12-28  
可以定义一个自定义异常类(extends Exception),在程序中将异常一层一层的抛到最顶层再处理.
0 请登录后投票
   发表时间:2007-03-07  
看看spring中的异常处理
0 请登录后投票
   发表时间:2007-03-08  
baidu一下 关于异常的争论--要检查,还是不要检查?
0 请登录后投票
   发表时间:2007-03-08  
昨天看到的一个:

To me, code looks a lot easier to read with:
- braces on its own line, opening and closing braces aligned.
- declare local variables as late as possible, keeping it in an as local scope as possible.
- write member variables differently as local variables.

Be consistent. Write like this and everything looks fantastic. I'm repeatedly stunned at how people write code.
try
{
  BufferedReader reader = new BufferedReader(new FileReader(file));
  try
  {
    doStuffWithFile(file);
  }
  finally
  {
    reader.close();
  }
}
catch (IOException ex)
{
  System.out.println("Error writing to file " + file);
}

BufferedReader reader = null;
try {
  reader = new BufferedReader(new FileReader(file));
} catch (IOException ex) {
  System.out.println("Error opening file " + file);
  return;
}
try {
  doStuffWithFile(file);
}
catch (IOException ex) {
  System.out.println("Error do stuff with file " + file);
  try {
    reader.close();
    reader = null;
  } catch (IOException ex) {
    System.out.println("Error closing file " + file);
  }
}
if (reader != null) {
  try {
    reader.close();
    reader = null;
  } catch (IOException ex) {
    System.out.println("Error closing file " + file);
  }
}


Oh my god, what the crap. But this is what I see over and over.
0 请登录后投票
   发表时间:2007-03-08  
我不同意出错就抛unchecked Exception(RuntimeException),对于业务类型的异常,比如UserLoginException,应该显式的高速上层他可能要抛出这个异常,比如:
    interface UserLoginService
    {
       public void login(String name,String pass) throws UserLoginException;
    }

这样Action就提醒Action,他抛出的异常,Action应当捕获这个异常,它描述的是“例外”而不是一个错误
0 请登录后投票
   发表时间:2007-07-28  
我不太赞成将一些例外都设计成异常, 我认为异常还是要尽量少使用. 因为抛出异常会使程序流程有巨大改变导致性能上的损失.

异常分为 Exception, RuntimeException.
RuntimeException 不需要显示地 checked.

像这样的地方, 我更倾向于在object.xxxx 的时候 自动让系统底层将此异常抛出. 而不需要自己来检测这个object 是否是个null 引用.
if(object == null)  
     threws new NullPointerExcction("对象不应该为空"); 

如果规范里有明确的说明异常设计原则, 那自然应该遵守规范里的. 如果没有. 那么就应该自己来设计了. 关于login, 因为最开始我说了倾向于不设计异常. 而使用结果的形式来告诉调用者发生了什么事情. 那我更喜欢用返回值来说明问题. 如果返回值无法足够表述清楚. 那就用异常.

像login的结果, 成功,失败,而失败有好多种情况,用户名不对,密码不对, 已在线, 或因其他原因不允许登录. 这些是正常的应用结果. 不属于程序错误, 那就应该显示告诉调用者, 或者说显示将此方法的异常做为接口说明清楚, 那么抛出的异常应该继承自Exception. 这样login方法签名里需要显示将这些Exception的子类. 用throws 关键字说明清楚.

那什么时候抛出RuntimeException 呢? 相反, 很多情况下不需要用RuntimeException. 我的理解是一个设计良好的程序, 不应该被RuntimeException 给打断执行.

个人想法仅供参考
0 请登录后投票
   发表时间:2007-07-29  
J2ee design and development -rod johnson
chapter 4, Exception Handling – Checked or Unchecked Exceptions
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics