大多数java教程的书籍中,对异常的处理都是及时的,也就是哪里抛了,就在哪里catch.
看别人的代码渐渐多了,就有些模糊的意识到不是所有的异常都是及时处理的,而是通过throws抛给调用者处理.
问题出来,每次遇到异常的时候,我就在catch与throws之间挣扎好久,那么到底要在哪里处理异常?似乎书上并没有答案.
我曾就这个问题请教过一个前辈,他的解答是"在合适的地方处理". 汗,我被这有点"玄机"的回答给忽悠了.
经过了一些实践和思考,我开始有点感觉了,就在我被别人问到这个问题之后,我这样总结到:
"判断异常要不要throws,关键看调用者是否关注这个异常;若不关注,则就地catch处理掉"
貌似有点指导意义了:P. 不过如何指导调用者是否关注呢?
若你是少有参与设计,且只负责一小块功能模块的程序,这个问题对于你来说确实不好判断.因为它的判断是需要基于全局的,通常设计者要慎重考虑.那么设计者是如何把握异常的处理呢,其中的原则又是什么呢?
这里我就自己的理解,总结一下以供参考.
业务流程异常是指业务流程中预料到的异常并且要对此进行处理. 举个ATM提款的例子来说明:
- ATM提款后,都会有打印一个"回执"给用户.但"回执"的纸张不是每次都够用的(我就经常遇到这种破事),这中异常情况通常都会在用户插卡输入正确的密码之后,出现询问"无法打印回执,是否继续?"的提示. 此时这异常就需要从检查纸张的低层模块中throws给业务逻辑处理模块,再抛给界面处理模块等待用户处理.
也许这个例子对于I/O或格式转换类的基础异常可能不能完全说明问题,那么再看一个文件读取的例子:
- 有个文件上传的程序,需要用户通过界面输入要上传的文件,此时是有可能出现文件不存在或文件被锁定之类的问题的.因此,访问文件I/O的低层模块就需要把这类异常throws给调用者,同上面的例子一样交给用户处理.
由这个原则1可以推理出下面一个原则.
- 原则2 低层被调用的模块的异常一般都throws给它的调用者处理.
注意,这里强调一下是"一般",而不是所有情况.什么情况原则2不适用呢?请看原则3.
不影响业务流程的异常是指严重级别比较低,只需要记录甚至可以完全忽略的异常.通常不做特别的处理是不想中断正常的业务进程.
此外,还补充一点,对于需要销毁或释放资源的业务逻辑中,异常的处理很需要经验和技巧的,因为处理不当容易造成内存泄漏和低效率的问题,这块我尚无成熟经验,还请.
分享到:
相关推荐
- `EXCEPTION_CONTINUE_SEARCH`意味着不在此处处理异常,而是继续在其他注册的异常处理程序中寻找合适的处理方法。 - `EXCEPTION_CONTINUE_EXECUTION`表示异常已经被处理,程序应尝试恢复执行,但这通常在异常可以被...
在MySQL中,异常定义和处理主要是通过`DECLARE`语句来实现的。 1. **异常定义** 异常定义是创建一个特定的条件(condition),这个条件关联到可能发生的错误或警告。语法如下: ```sql DECLARE condition_name ...
Java 异常处理是 Java 编程语言中的一种重要机制,用于处理程序在运行时可能出现的错误或异常情况。下面是关于 Java 异常处理的习题和知识点总结: 一、Java 异常处理关键字 * Java 中用来抛出异常的关键字是 `...
在易语言中,线程是并发执行的程序单位,线程结构异常处理是编程过程中非常重要的一环,因为线程可能会遇到各种异常情况,如内存访问错误、除零异常等。 线程结构异常处理源码是易语言中处理这些异常的关键部分。当...
【异常处理】是编程中必不可少的一个环节,尤其是在Java这样的面向对象语言中。异常处理机制使得程序在遇到错误时能够优雅地中断执行流程,提供错误信息,并有机会进行恢复操作,而不是简单地崩溃。以下是对异常处理...
异常处理是指程序在运行过程中,发生错误会导致程序退出,这种错误,就叫做异常。 因此处理这种错误,就称为异常处理。 二、异常处理如何操作? C# 异常处理时建立在四个关键词之上的:try、catch、finally 和 throw...
在标题提到的"易语言HOOK异常处理"中,我们关注的是如何在易语言中实现对系统或应用程序的钩子,并在发生异常时进行有效处理。"HOOKSehProc"可能是一个自定义的异常处理过程,用于替代默认的异常处理器,当异常发生...
我们在捕获到异常并对异常进行处理时可能会遇到如下一些问题: 1.不确定应如何处理这些异常 2.需要记录异常日志时没有记录,或者异常在不同的地方重复记录,使得排错调试不方便 3.处理日志时,需要在每一个try-catch...
在编程领域,异常处理是确保程序健壮性与稳定性的关键技术。对于C、C++以及基于MFC(Microsoft Foundation Classes)的开发来说,异常处理更是不可或缺的一部分。本篇文章将深入浅析C、C++中的异常处理机制以及MFC中...
在分布式服务框架 Dubbo 中,异常处理是必不可少的一部分。Dubbo 提供了强大的异常处理机制,使得服务提供者能够向消费者传递自定义异常,从而帮助消费者更好地理解和处理服务调用中的错误情况。本文将深入探讨如何...
在易语言中,SEH(Structured Exception Handling)异常处理机制是用于处理程序运行时可能出现的错误或异常情况的重要工具。本文将详细讲解易语言中的SEH异常处理,以及相关的关键技术点。 SEH是微软Windows操作...
异常处理在ARM架构中有着严格和细致的步骤,以确保系统能够及时准确地响应并处理各种异常。 ARM处理器有多种工作状态,主要分为ARM状态和Thumb状态。ARM状态执行的是32位的字对齐ARM指令,而Thumb状态执行的是16位...
异常处理是嵌入式系统中至关重要的部分,特别是在基于ARM架构的系统中。本文将深入探讨ARM处理器的异常处理机制,包括异常类型、处理流程、异常优先级以及向量表等内容。 一、异常类型 ARM处理器支持多种类型的异常...
在Java中,全局异常统一处理是一种常见的错误处理模式,它允许在一个单独的地方集中处理应用程序中抛出的所有异常。这种处理方式有助于简化代码,提高代码的可读性和可维护性。 要实现全局异常统一处理,Java提供了...
在Delphi编程环境中,异常处理是一项至关重要的技术,它允许开发者捕获并处理程序运行时可能出现的错误或异常情况。本文将深入探讨Delphi中的异常处理机制,包括异常的种类、如何抛出和捕获异常,以及如何有效地利用...
catch 语句块会捕获 try 代码块中发生的异常并在其代码块中做异常处理,catch 语句带一个 Throwable 类型的参数,表示可捕获异常类型。 finally 语句块是紧跟 catch 语句后的语句块,这个语句块总是会在方法返回前...
异常处理是每个应用程序都会用到的,纵然在程序编写期间我们都会最大限度的考虑可能发生的异常并进行相应的处理,但是往往并不能完全考虑周全,百密一疏,出现未处理异常而导致程序出错,数据丢失,如用户输入错误...
异常处理是Java编程中至关重要的一个概念,它确保了程序在遇到错误或异常情况时能够以优雅的方式继续执行或者终止。下面是对Java异常处理机制的详细解析。 在Java中,异常是程序运行时发生的错误,它中断了正常的...