`
wuhua
  • 浏览: 2112406 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

阅读更多
      最近设计程序的时候,老抛出NullPointerException,ArrayOutOfIndexException异常,发现这些异常的抛出对程序的稳定性是有好处的。它可以防止程序崩溃。
     不过相信开发过程序的人应该对这些异常操作是很厌烦,有什么办法可以避免这些操作呢?
     什么时候抛出异常,什么应该在程序里抓住异常?
     比如你对一个对象的操作
    
java 代码
 
  1.    
  2. if(object == null)  
  3.      threws new NullPointerExcction("对象不应该为空");  
  4.   
  5.   
  6.   
  7. if(object == null)  
  8.      return;  
这两种方式在设计的时候经常使用,有些程序容许你对象为空的时候可以进行下一步操作,有些程序则强制要求上一步的环境一定要建立,比如对象步能为空,资源一定要存在等。

欢迎各位高手谈谈异常体系上设计的心得,
异常设计的好可以减少很多if,witch等语句。

那个用户登陆的例子来说吧。
记得以前写过程式编程的时的代码如下:
java 代码
 
  1. int isNotExist = 1;  
  2. int succes = 0;  
  3. int passwordError= 2;  
  4. int ,......  
  5.   
  6.   
  7. int login(){  
  8. ...................  
  9. ................  
  10. return i;  
  11. }  

采用异常处理时候
java 代码
 
  1. class UserNotFindExecption{  
  2. .........  
  3. }  
  4.   
  5. void login() throw Exception{  
  6. .........  
  7. throws new UserNotFindExecption()  
  8. }  

这两种设计方式就很考究你对异常的理解。
分享到:
评论
19 楼 Godlikeme 2007-07-29  
J2ee design and development -rod johnson
chapter 4, Exception Handling – Checked or Unchecked Exceptions
18 楼 srdrm 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 给打断执行.

个人想法仅供参考
17 楼 刑天战士 2007-03-08  
我不同意出错就抛unchecked Exception(RuntimeException),对于业务类型的异常,比如UserLoginException,应该显式的高速上层他可能要抛出这个异常,比如:
    interface UserLoginService
    {
       public void login(String name,String pass) throws UserLoginException;
    }

这样Action就提醒Action,他抛出的异常,Action应当捕获这个异常,它描述的是“例外”而不是一个错误
16 楼 shaucle 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.
15 楼 shaucle 2007-03-08  
baidu一下 关于异常的争论--要检查,还是不要检查?
14 楼 haihai 2007-03-07  
看看spring中的异常处理
13 楼 wjtang 2006-12-28  
可以定义一个自定义异常类(extends Exception),在程序中将异常一层一层的抛到最顶层再处理.
12 楼 shaucle 2006-12-28  
出了错就抛runtime,一般不要用返回值,否则会很ym的
可能出错就throws runtime (具体如lane_cn所言)
最重要的一点就是不要淹没异常,对于check的你可以rethrow(因为俺讨厌异常链,到后面不仅冗长,而且根本就没什么主义了)

异常style可参考http://www.javalobby.org/java/forums/t82979.html
11 楼 wuhua 2006-12-27  
楼上的说的很好。我一直想说这些,但是我表达不出来
受教了。
10 楼 lane_cn 2006-12-27  
异常是接口的一个约定,相比起返回值的方式,异常具有更加明确的业务含义。
返回值只是一种强制的约定,业务含义是含糊的,异常是非常明确的。
比如:
interface Person {
Age getAge() throws AskLadyException;
}
这样的接口设计,意义就很明确。返回null表示“我不知道”,抛出异常表示“你不该问”。
9 楼 together 2006-12-27  
在java版块搜索一下"checked"......
8 楼 pig345 2006-12-27  
那么,在这个方法中
代码

   1. void login() throw Exception{    
   2. .........    
   3. throws new UserNotFindExecption()    
   4. }  


如果登陆成功,会如何返回呢?

其实,可以返回一个Session对象。里面描述了本次登录会话的数据(ID,权限,时间 等等)。
7 楼 pig345 2006-12-27  
稍微了解下EJB对异常设计方面的要求和规范,基本上就全都明白了。

一般的,系统设计里面要分为两种异常:系统异常和应用异常。前者以RuntimeException的子类实现,后者以Exception的子类实现。

遇到系统级别的问题(你的应用里面处理不了,比如:意外的IOException、SQLExcetpion)直接包装成RuntimeException的子类并抛出。在EJB这一层一旦发现RuntimeException事务就会自动会滚。

另外的,你可能会遇到应用级别的非正常情况,可能需要提示给当前用户或上层API,(比如:用户登录时可能会出现:用户名密码错误、当前用户已经登录、当前用户积分不足不允许再次使用...等等情况),这个时候,你需要定义自己的应用异常,并抛出给上层程序(很可能是UI层,他们catch后,根据当时的上下文,形成一个字符串以提示用户)。在EJB这一层你抛出Exception,事务依然会被成功提交。
6 楼 wuhua 2006-12-25  
好像我也读过,好像是关于怎么以样OO的。就在这个论坛里吧,查下
5 楼 ddandyy 2006-12-25  
这个好早以前说得已经很细了吧
记得我就是被google到的那个帖子勾引过来的
4 楼 wuhua 2006-12-25  
Feiing 写道
NullPointerException, ArrayOutOfIndexException 跟 UserNotFindExecption 完全不是一种类型的异常, 前者大多是参数不正确导致, 后者是业务异常, 怎么能混为一谈


没别的意思,只是拿来做个例子,然后想看看高手们是怎么设计异常已经对异常的处理的
3 楼 wuhua 2006-12-25  
成功不返回,
只是出错的时候抛出异常,由以后的程序去处理
比如我写了Service的login
在Action的login中去处理Service抛出来的异常

然后在Action具体改怎么做。
2 楼 dodoflying 2006-12-25  
那么,在这个方法中
void login() throw Exception{   
.........   
throws new UserNotFindExecption()   
} 

如果登陆成功,会如何返回呢?
1 楼 Feiing 2006-12-25  
NullPointerException, ArrayOutOfIndexException 跟 UserNotFindExecption 完全不是一种类型的异常, 前者大多是参数不正确导致, 后者是业务异常, 怎么能混为一谈

相关推荐

    java试验报告之异常处理程序设计

    **异常处理在Java编程中的重要性** 异常处理是Java编程中的关键组成部分,它允许程序员...通过这个实验,学生不仅学习了异常处理的基本原理,还掌握了如何设计和应用异常处理程序,这对于他们的Java编程生涯至关重要。

    MFC程序设计详细实例 第28章 异常处理

    MFC程序设计详细实例 第28章 异常处理MFC程序设计详细实例 第28章 异常处理MFC程序设计详细实例 第28章 异常处理MFC程序设计详细实例 第28章 异常处理MFC程序设计详细实例 第28章 异常处理MFC程序设计详细实例 第28...

    易语言线程结构异常处理

    在易语言中,线程是并发执行的程序单位,线程结构异常处理是编程过程中非常重要的一环,因为线程可能会遇到各种异常情况,如内存访问错误、除零异常等。 线程结构异常处理源码是易语言中处理这些异常的关键部分。当...

    高效的java异常处理框架高效的java异常处理框架高效的java异常处理框架

    讲述 Java 异常处理的基本知识,分析 Java 异常体系结构,对比 Spring 的异常处理框架,阐述异常处理的基本原则,并提出了自己处理一个大型应用系统异常的思想,并通过设计一个异常处理的框架来论述此思想。...

    Java面向对象程序设计 实验四 异常处理

    Java面向对象程序设计实验四 异常处理 Java面向对象程序设计实验四的主要目的是掌握异常处理的技术,了解自定义异常类与异常跟踪栈的概念。在这个实验中,我们将学习如何捕获并处理异常,并通过编写程序来验证...

    异常处理 C语言程序设计教程C输入输出流PPT课件.pptx

    异常处理 C 语言程序设计教程 C 输入输出流 PPT 课件 本资源摘要信息来自 Exception Handling in C Programming Design Tutorial PPT Courseware,总页数为 18 页,主要讲解了 C 语言程序设计中异常处理的概念、...

    Python-异常处理-教学设计.docx

    问答互动引出学习目标 讲授法 示范练习 随堂报告 Python-异常处理-教学设计全文共6页,当前为第1页。Python-异常处理-教学设计全文共6页,当前为第1页。《异常处理》教学设计 Python-异常处理-教学设计全文共6页,...

    易语言SEH异常处理

    本文将详细讲解易语言中的SEH异常处理,以及相关的关键技术点。 SEH是微软Windows操作系统中的一种异常处理框架,它提供了一种有序的方式来捕获和处理程序执行过程中的异常。在易语言中,我们可以通过设置异常处理...

    易语言HOOK异常处理

    "New_SE_Handler"可能是一个新的结构化异常处理程序,结构化异常处理(SEH)是Windows操作系统中的一个特性,用于处理硬件和软件异常。 "GetSeAddr"可能是获取异常发生时的地址函数,这对于分析异常原因和定位问题...

    关于C++异常处理和win32结构化异常处理

    关于C++异常处理和Win32结构化异常处理(Structured Exception Handling, SEH)的知识点,我们可以深入探讨其原理、差异以及如何在Windows平台上有效利用这两种机制。 ### C++异常处理 C++中的异常处理机制主要由`...

    基于ARM的嵌入式系统程序开发要点(四)——异常处理机制的设计

    本文将围绕异常处理机制进行深入探讨,包括但不限于ARM处理器中的异常类型、异常响应过程以及如何设计高效的异常处理程序等。 #### ARM处理器中的异常类型 ARM处理器支持多种类型的异常,主要分为以下几类: 1. *...

    JCVM异常处理机制

    ### JCVM异常处理机制 #### 一、JCVM中的异常类层次结构 ...通过对异常类层次结构的合理规划、异常处理表的有效构建与维护,以及对资源的高效管理,JCVM实现了既符合Java标准又适应智能卡环境的异常处理策略。

    Java异常处理终结篇——如何进行Java异常处理设计 - 望远的个人页面 - 开源中国社区1

    Java异常处理设计是Java编程中一个至关重要的环节,它直接影响到程序的稳定性和可维护性。在Java中,异常处理是通过try-catch-finally语句块来实现的,主要涉及两大类异常:编译时异常(Checked Exception)和运行时...

    Windows下的异常处理

    下面我们将详细探讨Windows下的异常处理机制及其相关知识点。 一、异常的基本概念 异常是程序执行过程中遇到的非正常情况,如除零错误、访问无效内存地址、硬件故障等。在Windows中,异常由处理器硬件引发,然后由...

    c,c++异常处理

    - **结构化异常处理(SEH)**: 这是一种专为Windows设计的异常处理机制,可以通过`__try`和`__except`块来捕捉和处理异常。 - **特定的宏和函数**: 提供了一些特定的宏和函数来帮助程序员处理异常情况,如`_set_error_...

    异常处理流程图Exception

    通过合理设计异常处理流程,开发者可以确保即使在面对不可预测的错误时,也能提供一个清晰、可控的错误响应机制,从而维护程序的稳定性和安全性。对于复杂的系统而言,构建一套全面且细致的异常处理策略至关重要,这...

    支持异常和中断的CPU verilog设计和仿真代码

    `epc`(Exception Program Counter)寄存器保存了发生异常或中断时当前指令的地址,这使得在异常处理完成后,CPU可以返回到正确的位置继续执行。`status`寄存器则用来记录CPU的状态信息,如中断屏蔽位,它控制哪些...

    易语言SEH异常处理源码.rar

    在这个"易语言SEH异常处理源码.rar"压缩包中,包含的主要是易语言的源代码,涉及到的是系统异常处理的相关技术,特别是结构化异常处理(Structured Exception Handling,简称SEH)。 结构化异常处理是Windows操作...

Global site tag (gtag.js) - Google Analytics