`

捕获异常然后抛出另一个异常发生了什么

阅读更多
package com.lwf.thinking.eight;
import java.sql.SQLException;
public class UserDefineException {
	public static void main(String[] args) {
		try {
			catchException();
		} catch (EusException e) {
			e.printStackTrace();
		}
	}
	
	public static void catchException() throws EusException{
		try {
			throwException();
		} catch (SQLException e) {
			throw new EusException();
		}
		
	}
	public static void throwException() throws SQLException{
		System.out.println("throwException");
		throw new SQLException();
	}
} 

 对应的自定义异常类为:

package com.lwf.thinking.eight;
public class EusException extends Exception {
	public EusException(){
		super();
	}
	
	public EusException(String exception){
		super(exception);
	}
	
	
	
	
}
 

上述代码输出结果为:

throwException
com.lwf.thinking.eight.EusException
    at com.lwf.thinking.eight.UserDefineException.catchException(UserDefineException.java:19)
    at com.lwf.thinking.eight.UserDefineException.main(UserDefineException.java:9)
可以看到输出结果看不到最开始的throwException中抛出的SQLException,这是因为在catchException中抛出的是EusException而不是SQLException

那么当我抛出另一个异常的时候也想让这个异常包含引发它的异常怎么做呢?

修改异常类:增加方法

public EusException(Throwable cause){
        super(cause);
    }

 

对应异常类为:

package com.lwf.thinking.eight;
public class EusException extends Exception {
	public EusException(){
		super();
	}
	
	public EusException(String exception){
		super(exception);
	}
	
	public EusException(Throwable cause){
		super(cause);
	}
	
 }
 

代码改为:

throw new EusException(e);

如下:

package com.lwf.thinking.eight;
import java.sql.SQLException;
public class UserDefineException {
	public static void main(String[] args) {
		try {
			catchException();
		} catch (EusException e) {
			e.printStackTrace();
		}
	}
	
	public static void catchException() throws EusException{
		try {
			throwException();
		} catch (SQLException e) {
			throw new EusException(e);//修改处
		}
		
	}
	public static void throwException() throws SQLException{
		System.out.println("throwException");
		throw new SQLException();
	}
}
 

输出结果为:

throwException
com.lwf.thinking.eight.EusException: java.sql.SQLException
    at com.lwf.thinking.eight.UserDefineException.catchException(UserDefineException.java:19)
    at com.lwf.thinking.eight.UserDefineException.main(UserDefineException.java:9)
Caused by: java.sql.SQLException
    at com.lwf.thinking.eight.UserDefineException.throwException(UserDefineException.java:25)
    at com.lwf.thinking.eight.UserDefineException.catchException(UserDefineException.java:17)
    ... 1 more
可以看到结果列出了引发的原始异常SQLException。

注意,因为JAVA API中有很多类并没有参数为Throwable 类型的构造函数:

public EusException(Throwable cause){
        super(cause);
    }

但自Throwable类继承过来的类都有initCause(Throwable cause)方法,所以另一种实现的方式是:

异常类不变。

package com.lwf.thinking.eight;
import java.sql.SQLException;
public class UserDefineException {
	public static void main(String[] args) {
		try {
			catchException();
		} catch (EusException e) {
			e.printStackTrace();
		}
	}
	
	public static void catchException() throws EusException{
		try {
			throwException();
		} catch (SQLException e) {
			EusException eus = new EusException();
			eus.initCause(e);
			throw eus;
			//另一种方法抛出包含原有异常信息
		}
		
	}
	public static void throwException() throws SQLException{
		System.out.println("throwException");
		throw new SQLException();
	}
}
 
分享到:
评论

相关推荐

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

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

    Java 自定义异常和抛出异常

    另一方面,`throws`关键字用于方法声明,表示该方法可能会抛出异常,但不会在这里处理。这是将异常处理推迟到调用者的地方。例如: ```java public void readFile(String fileName) throws FileNotFoundException {...

    Release异常捕获

    在实际项目中,"异常规范"通常指一套约定,指导开发者如何有效地使用异常处理机制,包括何时抛出异常、何时捕获异常、如何命名异常类、如何编写异常处理代码等。遵循这些规范能够使代码更易读、更易于维护,也有助于...

    java throw抛出异常实例一

    异常处理通过`try-catch-finally`块来实现,其中`try`块包含可能抛出异常的代码,`catch`块捕获并处理异常,`finally`块则包含无论是否发生异常都需要执行的代码。 在`throw`语句中,我们可以指定一个异常对象来抛...

    java异常处理机制示例(java抛出异常、捕获、断言)

    1. **try** 关键字:用于包围可能抛出异常的代码块。当try块中的代码抛出一个异常时,控制权会立即转移到与之匹配的catch块。 2. **catch** 关键字:用于捕获try块中抛出的异常。你可以有多个catch块来捕获不同类型...

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

    这里,`try`块包含可能抛出异常的代码,`catch`块用于捕获特定类型的异常并进行处理,`finally`块则确保某些资源的释放或清理工作。 接下来,我们讨论“抛出异常”。在C#中,可以通过`throw`关键字来抛出一个异常。...

    java throw抛出异常实例二

    `throw`关键字在Java中被用来显式地抛出一个异常。当我们遇到一个预期之外的情况,或者某些条件不满足时,可以使用`throw`来中断当前的执行流程,并将控制权转移到能够处理这种情况的代码块。下面我们将详细讨论`...

    抛出异常代码示例

    这段描述进一步明确了代码示例的具体语言环境为Java,并强调这是一个简单的示例,旨在帮助读者理解如何在Java中实现异常抛出。Java作为一种广泛应用的面向对象编程语言,提供了丰富的异常处理机制,包括`throw`...

    java try…catch嵌套捕获异常的实例

    当一个`try`块中的代码抛出异常,相应的`catch`块将捕获该异常并执行相应的处理代码。在某些情况下,我们可能需要对不同类型的异常进行不同的处理,这就是`try-catch`嵌套的用武之地。 首先,让我们理解`try-catch`...

    实现Java异常抛出和处理

    如果一个方法可能抛出异常但不处理,那么该方法必须声明它可能会抛出的异常,这样调用这个方法的代码就必须处理这些异常: ```java public void readFile(String filePath) throws IOException { File file = new ...

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

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

    全局未捕获异常处理示例

    在Android开发中,全局未捕获异常处理是一个至关重要的环节,它确保了应用程序即使在遇到错误时也能优雅地处理,防止应用突然崩溃,提供良好的用户体验。"全局未捕获异常处理示例"这个主题深入讲解了如何在Android...

    抛出异常的事例

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

    捕获异常(字母为0的异常)

    在大多数编程语言中,这会导致程序崩溃并抛出一个错误,如Python的`ZeroDivisionError`,Java的`ArithmeticException`,或C++的`std::invalid_argument`。 在处理这种异常时,程序员通常会采用异常处理机制来确保...

    捕获异常和集合

    通过合理地使用try-catch-finally结构、自定义异常和正确声明抛出异常,我们可以有效地管理程序中的错误,确保应用程序能够优雅地处理各种异常情况。在处理数据库操作时,尤其是使用JDBC时,熟练掌握异常处理技巧更...

    利用springmvc切面捕获全局异常入库源码

    为了实现这个功能,开发者可能创建了一个自定义的切面,包含一个后置通知(after advice),这个通知会在方法抛出异常时执行。后置通知可以访问到抛出的异常,从而可以记录异常信息并将其存储到数据库。通常,这会...

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

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

    C# 捕获异常

    这里没有明确的`try-catch`结构,而是使用了`int.TryParse`方法,它不会抛出异常,而是返回一个布尔值表示转换是否成功。 2. **第二个示例**: 此示例使用了完整的`try-catch`结构。在`try`块中,尝试将字符串`sr`...

    android全局异常捕获

    `Thread.UncaughtExceptionHandler`是Java线程处理未捕获异常的接口,当线程抛出一个未捕获的异常时,系统会调用该接口的`uncaughtException`方法。 以下是一个简单的全局异常捕获实现步骤: 1. 创建自定义的`...

    子线程任务发生异常,主线程事务如何回滚

    如果子线程执行过程中发生异常,Future 对象将抛出异常。我们可以使用 try-catch 语句来捕获异常,并进行事务的回滚。 当子线程任务发生异常时,如何让主线程捕获到该异常并进行事务的回滚?答案是使用 Callable ...

Global site tag (gtag.js) - Google Analytics