`
seeglow
  • 浏览: 54415 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

错误处理规范

阅读更多

一、整体规范

1.      按照错误类型,通常的处理方式如下:

 

错误类型

范围

处理方式

操作员错误

与人机界面交互时不满足输入规则、输入范围等发生的错误

校验用户输入

提示正确规则

强制其改正

运行时错误

与外部资源交互时发生的错误,如网络、文件系统、数据库、其它业务应用系统等

记录并抛出异常

其它详见“异常处理规范”

程序员错误

与客户模块交互时不满足前置条件后置条件发生的错误,如类库被其他程序员调用时参数超出范围等

使用断言

2.      按照调用类型,通常的处理方式如下:

 

调用类型

处理方式

同步调用

  • 对有能力处理的异常,捕获并处理之
  • 对原始信息过于技术化的异常,捕获并包装之,重新抛出
  • 在调用的中间层,对未知异常保持沉默
  • 在调用的最高层,必须捕获所有异常,避免本身进程或宿主进程崩溃
  • 其它详见“异常处理规范”

异步调用

  • 异步调用一般不应有任何返回值
  • 服务方最好以同样的方式返回正常信息和错误信息,即正常信息是通过通知的方式返回的话,错误信息也应该通过通知的方式返回;正常信息是通过主动查询得到的话,错误信息也应该通过主动查询得到

 二、异常处理规范

 异常应该是分层的

 1. 异常定义

  • 每个模块应该有自己的应用程序异常类型层次,从本模块主动抛出的应用程序异常都应该属于该异常类型层次,客户代码可以只捕捉该层次的基类(?)
  • 应用程序的所有自定义异常都应该从开发平台提供的“应用程序异常基类”派生
  • 中间件等平台程序的运行时异常都应该从开发平台提供的“运行时异常基类”派生(?)
  • 中间件等平台程序的运行时错误都应该从开发平台提供的“错误基类”派生(?)

 2. 异常捕获

  • 对有能力处理的异常,捕获并处理之
  • 在调用的中间层,对未知异常保持沉默
  • 在调用的最高层,必须捕获所有异常,避免本身进程或宿主进程崩溃
  • 记录捕获到的每个原始异常的信息

 3. 异常抛出

  • 每个模块应使用本模块所能得知的最精确的错误原因报告异常信息
  • 如果有原始异常,在重新抛出的自定义异常中附加原始异常的信息

 三、几点说明

 

 1. 错误处理与日志系统

  • 错误处理不等同于日志系统,日志系统只是错误信息的一种记录手段
  • 错误信息的输出应全部调用日志系统来完成

 2. 程序员错误与运行时错误

  • 接口函数的前置条件,应该是一种规范,是客户程序员必须遵守的约定;客户程序员违反了约定,程序将产生异常或不可预知的错误;对于这类约定,不应该需要有运行时的代码检查 ;比如如果你的接口函数的一个参数不能为null,而你在函数开始部分程序里写:

         if(xxx == null){

              throw new someException();

}

你的代码实际上允许该参数为null,因为你对null的情况进行了运行时处理;尽管你在文档里声明该参数不能为null,但如果客户程序员遵守了约定,那么你这段检查代码就是冗余的

  • 当你对参数没有任何检查就进行了使用,而非法的参数值导致了错误,此时有两种情况: 如果你在接口函数说明里列出了参数不允许的非法取值,那么客户程序员应该修改程序避免传入非法值,该类错误称为程序员错误;如果你没有说明,那么你应该修改函数,处理非法参数
  • 不是所有的限制条件在文档里说明一下,就可以把责任扔给客户程序员了,有一些错误必须处理:特别是客户程序员不需要import你的package就可以和你的接口交互的情况,如socket服务器 ,你必须在socket服务程序内部检查所有接收到的数据,拒绝错误的请求,否则极易遭到攻击

 3. 错误代码与异常

  • 不应该使用bool值来返回成功与否,bool返回值只应用在真正查询bool状态的操作中,如 bool IsDirty()bool hasNext()
  • 整形或bool型的错误代码返回值强迫客户程序员检查每一次调用,应用异常取代之

 

世界上并不存在完全无错的程序,我们不讨论它是不是一条真理。但它的确是一条警语,它告诫我们在编写程序时一定要注意尽可能地避免错误。

程序运行出错时会超出程序员的控制,使得程序南辕北辙,不仅无法正常完成功能,而且还会出现一些可怕的事情。

由于程序设计的错误而引起的事故数不胜数,损失最巨大的是美国的一次火箭发射,在那次悲剧中,在程序中由于错把写成了,却使得火箭在天上爆炸,所以为防止程序设计错误花再大的人力、物力也是应该的。

以上这段话说明了错误处理的重要性。

  最有效的解决方法是在程序设计是,有意识地加入一些机制,使其能够在运行时检测自己,在错误失控之前,报告出来。

最常见的一种错误处理是为每一个方法(其它语言,就是每一个函数)返回一个状态值,用来指示该方法是否成功、正确地完成了任务。当调用这个方法的程序收到了一个错误的状态值,就能够得知程序出错了,再采取有效的措施避免这个错误引起的问题(最简单的方法就是退出程序,或给出提示提醒操作者)。

首先让我引入一个概念:错误模式

所谓的错误模式,我理解和设计模式所涉及到的知识应该是一样的,错误模式就是已发出的错误和程序中潜在的错误之间的重复出现的相互关系。这种概念对编程来说并不是新鲜的,随便极端编程的出现,RUP,单元测试只能解决一部分存在的问题,所以我们采用错误模式,一个错误的出现,只要遵循我们可以识别的错误模式中的一种,随可以得知这个错误的原因并且纠正它。

有兴趣的朋友可以搜搜错误模式,有许多文章介绍的。以下是我要介绍的二种错误处理方式。

一 构造错误异常:

构造错误异常,这里就利用了错误模式去发现错误并纠正它,首先让看一段代码:

InvalidNameException.java

class InvalidNameException extends Exception{
    public InvalidNameException(){
    }
}

程序中:

public User validate(String userName,String password) throws InvalidNameException{
        if(userName.equals("java")){
        }else{
            throw new InvalidNameException();
        }
        //return null;
    }

以上这段代码,意思就是,如果用户名不为java的话,那么就抛出InvalidNameException()这个异常,于是我们就可以成功的捕捉这个异常,并发出提示或警告。这样构造一个强大的错误处理集合就可以对程序内部或外部进行错误处理。

 key/values方式.

    根据配置文件查找相应的错误信息,并显示给用户,struts的错误处理方式就采用了这个(其实我说的二种都采用了)。首先看一下以下代码:

ErrorMessage error=new ErrorMessage();
if(!username.equals(“java”)){
    error.add(“ERROR.LOGIN.USERNAME.FAILED”);
}

    创建一个ErrorMessage对错误进行处理,如果返回空的error对像的话,说明没有错误,如果返回一个非空的error对像,那么就跳转到error.jsp页面,并捕捉这个错误。

错误信息配置文件:

LOGIN = 用户登陆

ERROR.LOGIN.EMPTY_INPUT = 登陆失败:无效输入!

ERROR.LOGIN.EMPTY_INPUT.DESC = 可能输入了空值或其他非法字符。

ERROR.LOGIN.USERNAME.FAILED = 用户名错误

ERROR.LOGIN.USERNAME.DESC = 请后退重试,检查您的用户名是否输入正确!

以上两种方式结合于log4j一起使用,可以达到对错误处理的要求,我的思想就是在系统层,如方法内,抛出异常处理,在表现层对用户输入和相关处理用key/values方式处理,这种方式我以前在写程序的时候就在用,现在又搬出来希望能听到回复的声音,讨论一下,看一看有没有更好的解决方式,由于本人水平有限,目前的错误处理设计依然是基于这个去做的。

 

 

分享到:
评论

相关推荐

    JAVA的错误处理规范,很实用

    本篇文章将深入探讨Java的错误处理规范,并分享一些实用的技巧,帮助开发者构建更健壮的代码。 首先,我们需要了解Java中的异常体系。Java将错误分为两种类型:Error和Exception。Error通常表示系统级问题,如...

    软件工程编码规范

    软件工程编码规范的内容包括命名规范、编码规范、注释规范、错误处理规范等。这些规范可以帮助开发者编写高质量的代码,提高代码的可读性和可维护性。 4. 命名规范 命名规范是软件工程编码规范的重要组成部分。...

    API接口设计规范.docx

    在本规范中,我们将详细介绍 API 接口设计规范的各个方面,包括数据格式规范、API 接口的路径设计、请求参数设计、响应参数设计、错误处理规范和安全性规范等。 数据格式规范: * JSON 格式:API 接口中使用的数据...

    Java异常与错误处理中英文翻译

    Java通过强制性的异常处理机制解决了这一问题,将错误处理规范化,提高了代码的可读性、可维护性和整体质量。 #### 异常处理机制的起源 异常处理的概念源自操作系统领域,早在六十年代就已存在,后来在BASIC语言中...

    Oracle存储过程最基本的开发规范

    #### 十、错误处理规范 1. **错误捕捉**:涉及表操作的SQL语句必须进行错误捕捉。 2. **错误区分**:对于`SELECT`数据操作,应区分`NO_DATA_FOUND`和`TOO_MANY_ROWS`两种情况,并记录相应的错误信息。 3. **统一出口...

    C#编码规范.pdf

    6. 错误处理规范:包括错误处理的机制、错误处理的方式、错误处理的记录等。 7. 安全性规范:包括安全性检查、安全性测试、安全性评估等。 8. 单元测试规范:包括单元测试的目的、单元测试的方法、单元测试的内容...

    知名公司的编程开发规范与案例

    错误处理规范通常要求编写健壮的异常处理代码,确保程序的稳定性。代码结构应遵循模块化和高内聚、低耦合的原则,提高代码可读性和可复用性。 其次,"Panorama系统程序开发规范之二.doc"可能是针对特定系统或项目的...

    华为软件编程规范和范例.rar

    规范中强调了错误处理的重要性,建议在可能出现异常的地方设置适当的错误处理机制,如使用try-catch语句。错误信息应具体且易于理解,便于调试和排查问题。 四、注释与文档 注释是代码的重要组成部分,华为规范要求...

    嵌入式软件可靠性设计规范汇总.pdf

    8. 错误处理规范: 错误处理应遵循及时、准确的原则,避免使用过多的错误提示和警告,提高用户体验。 9. 编译器版本管理规范: 编译器版本管理应遵循统一的原则,避免使用不同的编译器版本,影响软件的稳定性和可靠...

    华为c语言编程规范2011版本

    总结,华为C语言编程规范2011版本是一套全面的编码指导原则,涵盖了命名、注释、代码风格、类型定义、错误处理、内存管理、指针与数组操作、并发编程、函数设计等多个方面,旨在提升软件开发的专业化和标准化水平。...

    MATLAB技术工程设计规范.docx

    4. **错误处理规范**: - 出现错误时抛出异常,而非返回错误码。 - 使用try-catch结构捕获并处理异常。 - 提供有用的错误消息和解决方案。 5. **性能优化和调试规范**: - 尽可能使用矩阵运算和向量化操作,...

    华为内部编码规范和范例

    四、错误处理 规范强调正确处理错误和异常,鼓励使用try-except-finally结构来捕获和处理异常,避免程序因未预期的错误而崩溃。同时,要提供合适的错误信息,帮助开发者定位问题。 五、代码复用与模块化 华为提倡高...

    成都市基本医疗保险支付接口应用编程规范V5.0

    7. 交易响应和错误处理 规范定义了对于不同交易的响应信息格式,以及在交易过程中可能出现的错误代码和错误信息处理机制。 8. 安全性和隐私保护 规范中还强调了对交易过程中涉及的个人隐私和数据的安全保护要求,...

    C++ 异常处理

    异常处理的指导思想是将错误处理规范化,通过throw和catch的机制来完成。当发生错误时,程序会立即抛出异常,而不是等到错误影响扩大。这样可以更早地介入错误处理,提高程序的健壮性。 在C++中,异常处理涉及的...

    VB自动添加错误处理工具

    在VB(Visual Basic)编程中,错误处理是一个关键部分,它确保程序...总的来说,"VB自动添加错误处理工具"是VB编程中的得力助手,它使得错误处理变得更加高效和规范,但使用时仍需结合人工审查和定制,以实现最佳效果。

    Go-Errcheck是一个程序用于检查Go程序中未经检查的错误

    通过使用和研究这个工具,我们可以更好地理解和实践Go语言的错误处理规范,从而提高代码的可读性和维护性。同时,了解并运用静态分析工具也能提升我们的编程技能,使我们能够编写出更高质量的软件。

    AUTOSAR_EXP_ErrorDescription.pdf

    《AUTOSAR标准错误描述》是关于智能驾驶和车辆标准的重要文档,主要涵盖了AUTOSAR Classic Platform在R20-11版本中的错误处理规范。AUTOSAR(AUTomotive Open System ARchitecture)是一个由汽车制造商、供应商和...

    系统源代码说明书-模板.docx

    * 错误处理规范 开发规范 开发规范是指系统开发过程中的通用规范和标准,包括编码、测试、发布等。开发规范可以包括以下几个方面: * 编码规范 * 测试规范 * 发布规范 工程代码目录 工程代码目录是指系统代码的...

    linux c语言错误处理

    在Linux系统中,C语言是基础且强大的编程工具,但同时也因为其低级特性,错误处理显得尤为重要。本文将深入探讨Linux环境下C语言编程中常见的错误处理策略和注意事项。 一、错误类型与处理机制 在C语言中,错误...

Global site tag (gtag.js) - Google Analytics