第二十三章 Exception Architecture
我们看一下应用程序开发中两类比较常见的异常情况,第一类是诸如数据库无法链接,配置文件不存在,SQL语句编译错误等的系统级别的异常,一旦这种异常发生基本上系统无法正常运行。另一类是诸如数据库中的内容不存在,格式不正确,业务逻辑不满足要求等的异常,这种异常往往只影响某一条的数据,不会对系统的正常运行有影响。
Java中的两类异常
Java中的异常分为两种类型运行时的异常(RuntimeException)和检查异常(Checked Exception)。
运行时的异常(RuntimeException)可以在程序运行的时候动态的抛出,但是不需要在方法接口中声明要跑出的运行时异常,也不需要在方法调用的时候做try-catch处理。系统的运行时异常是指java.lang.RuntimeExceptioin或者他的子类型。RuntimeException在逻辑上的含义是:
检查异常(Checked Exception)必须要在方法的接口中声明,并且在使用方法的时候,其抛出的Checked Exception必须使用try-catch处理,检查异常指的是java.lang.Exception或者他的子类型。
注意:有一点需要指出,java.lang.RuntimeException是java.lang.Exception的子类型。所以上述中说的检查异常(Checked Exception)指的是java.lang.Exception和其他的非java.lang.RuntimeException子类的子类型。
如下代码展示了RuntimeException的使用:
package com.jpleasure.exception;
/**
* System Exception
* @author mazhao@dl.cn
*
*/
public class SystemException extends RuntimeException {
public SystemException() {
}
public SystemException(String message) {
super(message);
}
public SystemException(Throwable cause) {
super(cause);
}
public SystemException(String message, Throwable cause) {
super(message, cause);
}
}
以下代码可以编译通过,运行的时候抛出异常:
package com.jpleasure.exception;
public class Main {
public static void main(String ... args ) {
testRuntimeException();
}
public static void testRuntimeException() {
methodThrowsRuntimeException();
}
private static void methodThrowsRuntimeException() {
if(true) {
throw new SystemException("Hello World!");
}
}
}
运行的时候输出内容为:
Exception in thread "main" com.jpleasure.exception.SystemException: Hello World!
at com.jpleasure.exception.Main.methodThrowsRuntimeException(Main.java:17)
at com.jpleasure.exception.Main.testRuntimeException(Main.java:11)
at com.jpleasure.exception.Main.main(Main.java:5)
以下代码展示了Exception的使用:
package com.jpleasure.exception;
/**
* Application Exception
* @author mazhao@dl.cn
*
*/
public class ApplicationException extends Exception {
public ApplicationException() {
// TODO Auto-generated constructor stub
}
public ApplicationException(String message) {
super(message);
// TODO Auto-generated constructor stub
}
public ApplicationException(Throwable cause) {
super(cause);
// TODO Auto-generated constructor stub
}
public ApplicationException(String message, Throwable cause) {
super(message, cause);
// TODO Auto-generated constructor stub
}
}
异常使用代码:
package com.jpleasure.exception;
public class Main2 {
/**
* @param args
*/
public static void main(String[] args) {
}
public static void testCheckedException() {
try {
methodThrowsCheckedException();
} catch (ApplicationException e) {
// 异常处理代码
}
}
private static void methodThrowsCheckedException() throws ApplicationException {
if(true) {
throw new ApplicationException("Hello World!");
}
}
}
由于ApplicationException是Checked Exception,所以在方法的接口中必须加以声明,并且在使用的时候必须包括在try-catch代码块中。
应用程序开发中的异常
如上述代码中说明的那样处于使用方便我们总是将系统异常设置为RuntimeException的子类,在统一的地方处理。
为什么要将系统异常设置为Runtime的呢?
try-catch块主要是为了在异常发生的时候有可以挽救的方式,所以会在try部分异常发生的时候进入catch部分,但是系统异常(例如数据库无法链接,配置文件不存在等)一旦发生基本上没有挽救的办法,所以将系统异常声明为RuntimeException的子类。
另外,系统异常是一种很少会发生的异常,所以在开发中基本不需要考虑,所以将系统异常生命为RuntimeException的子类,这样在开发的时候基本不需要考虑系统异常发生的情况,只需要统一的做错误处理即可。
应用程序异常通常设置为Checked Exception。需要在使用的地方逐个处理。
异常消息定义
异常消息通常不会在构造异常的时候传入,通常情况下在构造异常的时候传入的是异常消息的编号。
编号一般包含的内容有:系统ID,子系统ID,消息类型,流水号等。系统ID,子系统ID,流水号等都比较好理解,那么消息类型是什么呢?我们的消息常见的有以下一些类型:提示性的,警告性的,错误性的。所以我们可以分别以C(Confirm),W(Warnning),E(Error)来区分消息的类型
消息一般存储在属性文件(Properties)中使用ResourceBundle类或者Properties类来获取。当使用到多国语言的错误消息的时候需要使用ResourceBundle类。
有些时候也可以存储在代码中,这个时候需要使用到ListResourceBundle类。
异常发生时的操作
第一就是要记录错误日志,需要将类,方法,操作数据,异常类型,异常内容的信息记录下来,便于系统维护人员分析问题数据。
第二及时要抛出错误信息,反馈给系统用户,让客户知道系统无法处理他的当前操作。如果有必要还需要提示客户可能的错误情况,希望用户改善。
如何获得异常的详细信息
从异常中可以获得详细的抛出信息,例如都那些代码涉及到这个异常,分别在那些类的那些方法中,代码行数是多少,代码文件名字是什么等。
例如类LoginLogic调用了LoginDao,而Main调用了LoginLogic,代码为:
package com.jpleasure.exception;
/**
* Created by IntelliJ IDEA.
* User: ma.zhao@dl.cn
* Date: 2007-9-3
* Time: 22:55:47
* To change this template use File | Settings | File Templates.
*/
public class LoginDao {
public void testLogin() throws SystemException {
if(true) {
throw new SystemException("System Exception Occurs!");
}
}
}
package com.jpleasure.exception;
import java.util.Random;
/**
* Created by IntelliJ IDEA.
* User: ma.zhao@dl.cn
* Date: 2007-9-3
* Time: 22:56:30
* To change this template use File | Settings | File Templates.
*/
public class LoginLogic {
private LoginDao dao = new LoginDao();
public void testLogin() throws ApplicationException {
Random randam = new Random(System.currentTimeMillis());
int randamInt = randam.nextInt();
if (randamInt % 2 == 0) {
dao.testLogin();
} else {
throw new ApplicationException("Application Exception Occurs!");
}
}
}
异常处理代码:
package com.jpleasure.exception;
/**
* Created by IntelliJ IDEA.
* User: ma.zhao@dl.cn
* Date: 2007-9-3
* Time: 22:57:38
* To change this template use File | Settings | File Templates.
*/
public class Main {
public static void main(String[] args) {
LoginLogic logic = new LoginLogic();
try {
logic.testLogin();
} catch (ApplicationException e) {
printException(e);
} catch (SystemException e) {
printException(e);
}
}
private static void printException(Exception e) {
String msg = e.getMessage();
System.out.println("exception message:" + msg);
StackTraceElement[] stes = e.getStackTrace();
for (int i = 0; i < stes.length; i++) {
printStackTraceElement(stes[i]);
}
}
private static void printStackTraceElement(StackTraceElement ste) {
String fileName = ste.getFileName();
String className = ste.getClassName();
String methodName = ste.getMethodName();
int line = ste.getLineNumber();
System.out.println("file:" + fileName + "\t class:" + className + "\t method:" + methodName + "\t line:" + line);
System.out.println("");
}
}
分享到:
相关推荐
ARM架构异常处理ABI文档是一份关于ARM应用二进制接口(ABI)中异常处理组件的标准化文档。它详细描述了ARM架构下的异常处理模型,以及如何在可重定位和可执行ELF文件中进行编码。此外,还介绍了与语言无关的栈展开...
This manual describes the ARM® architecture v8, ARMv8. The architecture describes the operation of an ARMv8-A Processing element (PE), and this manual includes descriptions of: • The two Execution ...
从第七章到第十三章,这涵盖了类(classes)、对象(objects)、继承(inheritance)、多态(polymorphism)、模板(templates)以及异常处理(exception handling)等核心主题。以下是对这些章节习题源码中可能涉及...
根据提供的信息,我们可以总结出以下关于《Java语言程序设计基础第十版》第十二章的一些关键知识点及解答: ### 一、异常处理基本概念 #### 12.1 **问题:** 异常处理的主要思想是什么? **解答:** 异常处理的主要...
#### 二、异常体系结构 Java中的异常体系主要分为两大类:`Error` 和 `Exception`。 - **Error**:通常表示系统级的错误,例如内存不足等,这类问题程序员通常无法避免,也不应该去处理。 - **Exception**:表示...
在C++编程语言中,异常处理(Exception Handling)是一个至关重要的概念,它允许程序员优雅地处理程序运行时发生的错误情况,而不是让程序崩溃。"Exception C++ & More Exception C++"可能是指两本关于深入理解和...
异常(Exception)是Java中一种特殊的运行错误对象,它代表了程序执行期间发生的非正常情况,需要进行处理以避免程序中断。 18.1 异常类结构与组成 Java中的异常都源自`java.lang.Throwable`类。Throwable有两个...
#### 二、Native Exception流程 **1. Native Exception Flow** 当Native代码中发生异常时,会触发一系列的内部流程来捕获和处理这个异常: - **异常捕捉**: 当处理器检测到异常时,它会跳转到预定义的异常处理...
java Exception中Throwable和Exception之间的区别
#### 二、异常对象的传递 在Java中,如果一个方法中出现异常而没有进行处理,则该方法会将异常对象传递给调用者。这种传递方式沿着调用栈逆向传播,直至被适当的异常处理程序捕获或者最终由JVM处理,导致程序终止。...
This guide introduces the exception and privilege model in Armv8-A. This guide covers the different types of exceptions in ...architecture, and the behavior of the processor when it receives an exception
"ExceptionEx"是一个自定义的异常基类,设计用于提供更丰富的异常信息,特别是关于源代码位置的信息。这个基类通常是为了扩展C++标准库中的`std::exception`,增加额外的功能,比如包含抛出异常时的行号、文件名或者...
在编程世界中,错误处理是不可或缺的一部分,Java和许多其他编程语言中,"error"和"exception"这两个术语经常被提及。理解它们之间的区别对于编写健壮和可靠的代码至关重要。 首先,我们来看"error"。在Java中,`...
使用ExceptionApp通常从定义一个简单的Exception-Block开始,这个块包含try、catch以及可能的finally语句,使得异常处理结构清晰明了。 【Root Exception-Block】 Root Exception-Block是整个程序的顶级异常处理...
### 捕获Throwable与捕获Exception的区别 在Java编程中,异常处理是确保程序健壮性和稳定性的重要机制之一。通常我们使用`try-catch`语句来处理可能发生的异常情况。而在Java中,所有异常类都继承自`Throwable`类,...
java development part of exception
标题“Uncaught DOMException:”通常出现在JavaScript编程中,指的是在执行代码时遇到了一个未捕获的DOM(Document Object Model)异常。这个错误通常意味着在访问或操作DOM元素时发生了问题,可能是由于尝试访问不...
这就是“JAVA 自定义异常 Exception”所涉及的内容。 自定义异常是在Java中通过继承`java.lang.Throwable`或其子类(如`Exception`或`Error`)来实现的。通常,我们选择继承`Exception`类,因为它用于表示程序可以...
二、解决"a java exception has occurred"的方法 解决"a java exception has occurred"的方法非常简单,只需要在Eclipse中添加tomcat-ujli.jar到classpath中即可。下面是添加tomcat-ujli.jar的步骤: 1. 在Eclipse...