`
lizhuang
  • 浏览: 903684 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

何时抛出异常异常

阅读更多
我们写程序时经常遇到错误处理的情况,尤其是面向用户的应用程序(区别于面向开发人员的组件,类库)。笔者经常在写ASP.NET应用程序的时候,经常在返回错误代码和抛出异常之间徘徊,犹豫。即舍不得抛出错误代码这种方式的简洁,方便,又唯恐不使用抛出异常从而违反了.NET的设计准则。比方说,我们要写一个删除用户的方法,那么这个方法是要定义为void类型通过异常来处理删除失败的情况呢,还是定义为Boolean返回值来通过true或 false来返回删除的结果呢,笔者不得而知。为此,笔者捶胸顿足,不得安寝。于是笔者参考了两本猛书《.NET 框架程序设计》和《代码大全》,通过引用这两本书上的一些话来小作分析(书中的原文都用黑体标出)。

首先,我们讨论异常,还是要先知道异常是个什么东东。《.NET 框架程序设计》是这么定义的:“异常是对程序接口隐含假设的一种违反”。

这里面还有两个名词需要解释:”程序接口“和"隐含假设"。程序接口就是类型定义中的字段,属性,方法,事件等,这些成员的定义就是类型的程序接口。我们定义的接口通常会有一些隐含的假设,比方说删除用户的方法应当假设用户是存在的(对参数的假设),数据库连接是可用的(对执行环境的假设)等等。当这些程序接口中出现的假设呗违反时,异常就出现了。也就是说出现这两种情况时,我们应该抛出异常来反应这种违反程序接口假设的方法。

“因此,在设计一个类型是,我们应该首先假设类型最常见的试用方式,然后设计接口能使之能够很好的处理这种情况。最后再考虑接口带来的隐含假设,并且当任何这些假设被违反时便抛出异常。” 因此,异常不必然是错误,也不是什么无法预料的特殊情况,而是对程序接口隐含假设的一种违反。

下面给出一些《代码大全》中关于使用异常的忠告:

1. 只有在真正例外的情况写才抛出异常。换句话说,就是仅在其他编码实践方法无法解决的情况下才使用异常。异常的应用情形跟断言相似,都是来处理那些不仅罕见甚至永远不该发生的情况。

2. 不能用异常来推卸责任。如果某种的错误情况可以在局部处理,那就应该在局部处理掉它。不要把可以在局部处理掉的错误当成一个未被捕获的异常抛出去。

3. 创建一个集中的异常报告机制。有种方法可以确保异常处理的一致性,即创建一个集中的异常报告机制。这个集中的报告机制能够为一些与异常有关的信息提供一个集中的存储,如所发生的异常种类,每个异常该被如何处理及如何格式化异常消息等。

最后,奉上《代码大全》中的一句话,从应用程序的角度来解析错误处理,我看完有点顿悟的感觉。

应对应用程序运行时发生的严重错误的最佳做法,又是就是释放所有已获得的资源并终止程序执行,而让用户去重新输入数据再次运行程序(Stroustrup 1997)。

其实异常只是一种机制,不能因为编程语言中有这种机制而去使用异常,还有好多错误处理机制:在局部处理错误,使用错误代码来传递错误,在日志文件中记录调试信息,关闭系统等,这些方式应该灵活的应用,也许是单独地,也许可以交叉的使用,最终应该以两个标准来确定错误处理方式:用户的体验和设计的鲁棒性。



分享到:
评论

相关推荐

    关于在SQL中抛出异常的写法

    在SQL编程中,正确地抛出异常是调试和错误处理的关键环节。这使得开发者能够捕获并处理程序运行中的问题,特别是在复杂的存储过程和触发器中。本篇将详细讲解如何在SQL中抛出异常,以及它在报表开发中的应用。 SQL...

    Java 自定义异常和抛出异常

    自定义异常和抛出异常是Java异常处理机制的重要组成部分,它们允许开发者更精细地控制程序的错误处理流程。本篇文章将深入探讨这两个概念。 首先,让我们了解什么是自定义异常。Java提供了一套内置的异常类,如`...

    c#异常含异常格式,抛出异常和自定义异常

    本篇将深入探讨“异常格式”,“抛出异常”以及“自定义异常”这三大知识点。 首先,我们来看“异常格式”。在C#中,异常是通过`throw`语句来引发的,通常是由于程序运行时出现的不可预见情况。异常类通常继承自`...

    java throw抛出异常实例一

    `throw`关键字是Java中用于显式抛出异常的关键字。本实例将深入探讨如何使用`throw`来创建和处理自定义异常,以及它在实际编程中的应用。 首先,我们了解异常的基本概念。在Java中,异常是程序执行过程中遇到的不...

    java throw抛出异常实例二

    在上述示例中,我们捕获了`IllegalArgumentException`并打印出异常消息。`e.printStackTrace()`方法用于打印异常发生时的堆栈跟踪,这对于调试非常有用,因为它显示了异常发生的确切位置和调用栈。 Java的异常处理...

    方法抛出的异常处理 (2)修改UserDaoImp1类,要求用户id不能修改,修改则抛出异常 使用log4j输出日志信息

    (2)修改UserDaoImp1类,要求用户id不能修改,修改则抛出异常 (3)使用log4j输出日志信息 2.技能训练 (1)会使用try-catch-finally捕获和处理异常 (2)会使用throw和throws (3)会使用log4j记录日志 3.实践 ...

    抛出异常代码示例

    ### 抛出异常代码示例解析 #### 一、标题解析:“抛出异常代码示例” 此标题指明了文章的主要内容是关于“抛出异常”的代码示例。在编程中,“抛出异常”是一种常见的错误处理机制,用于在程序执行过程中遇到不可...

    C++ 异常类 抛出与捕获异常

    `try` 块用来包含可能抛出异常的代码,`catch` 块用于捕获并处理这些异常,而 `throw` 语句则用于在程序中引发异常。 `throw` 语句可以用于任何类型的数据,但通常我们使用预先定义的异常类来提高可读性和代码的...

    抛出异常的事例

    如果`toantitone`方法抛出异常,`main`方法中的`catch`块会捕获它,并通过`e.printStackTrace()`打印堆栈跟踪,帮助调试。`finally`块确保无论是否发生异常,都会执行一段代码(在这里是打印"over")。 `toantitone...

    析构函数不能抛出异常的原因

    ### 析构函数不能抛出异常的原因 在C++编程语言中,析构函数是一种特殊类型的成员函数,它主要用于在对象生命周期结束时执行清理工作,例如释放动态分配的内存资源等。由于析构函数的特殊性,C++标准明确规定:析构...

    21.javathrow抛出异常对象.zip

    21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21.javathrow抛出异常对象.zip21....

    22.javathrows声明抛出异常序列.zip

    22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22.javathrows声明抛出异常序列.zip22...

    实现Java异常抛出和处理

    `try`块包含可能抛出异常的代码,`catch`块用来捕获并处理异常,而`finally`块则包含无论是否发生异常都需要执行的代码: ```java try { // 可能抛出异常的代码 } catch (ExceptionType1 e1) { // 处理Exception...

    01主动抛出异常.py

    01主动抛出异常

    异常捕获与抛出的问题,什么时候应该try,什么时候应该throws

    在 Java 中,捕获异常和抛出异常是两种不同的机制,分别用于处理不同的异常场景。 捕获异常(try-catch) 捕获异常是指在方法内部使用 try-catch 语句来捕获可能出现的异常。捕获异常的目的是为了避免异常的传播,...

    检测程序异常关闭或抛出异常窗口 关闭程序并重新打开

    在IT领域,程序异常关闭或抛出异常窗口是常见的问题,这可能由多种原因引起,如内存泄漏、代码错误、系统资源不足等。为了解决这类问题,我们需要采取一系列的故障排查和处理策略。 首先,我们需要理解“检测程序...

    抛出异常截图

    抛出异常截图抛出异常截图抛出异常截图

    Java异常处理-throw手动抛出异常对象

    手动抛出异常则是根据业务逻辑或特定条件决定的,它允许开发者更精确地控制何时以及如何报告错误。手动抛出异常有助于提高代码的可读性和可维护性,因为它明确指出了哪些操作可能导致错误,并提供了处理错误的机会。...

    java异常抛出

    一个java抛出异常的小Demo 手动抛出 并处理

    C++抛出异常技巧讲解

    C++语言与其他编程语言一样,其中也包含有关于异常的处理。我们在这里将会为大家详细讲解一下有关C++抛出异常的实现方法,及异常的应用方式。希望大家可以从中获得些帮助,以提高对此的理解程度。

Global site tag (gtag.js) - Google Analytics