`

java - common practice to rethrow exceptions

    博客分类:
  • java
阅读更多

New comer to Java may throw exception in the wrong way, and the net outcome of that is very misleading error message, which can cause the user of the libraries very confused. so it is very vital to keep the exception right. 

 

One common case of dealing message is when you are dealing calls from a lower library and you may guard against potential damage from the down-stream and throw domain specific exceptions. that menas you may need to rethrow exception in cases. 

 

But it is easy to get it wrong. by wrong, it often meaning that the original stack is destroyed on the way to propagate to the final consumer.  Let 's do a comparison on the following code. 

 

Let 's see the code below 

package Syntax.rethrow;

import java.lang.UnsupportedOperationException;
import java.lang.Exception;

public class Rethrow {

	public static void generateException() {
		throw new UnsupportedOperationException();
		
	}
	
	public static void rethrowException() throws Exception{
		try { 
			generateException();
		} catch (Exception ex) {
			// you cannot swallow it 
			throw new Exception("Caught an exception", ex);
		}
	}
	
	public static void rethrowExceptionDestroyOriginalCallstack() { 
		try { 
			generateException();
		} catch (Exception ex) {
			throw ex;
		}
	}
	
	
	public static void main(String[] args) {
		try {
			rethrowException();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		System.out.println("-=========================");
		try {
			rethrowExceptionDestroyOriginalCallstack();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}
}

 

and when you run it, you will see error like this.

java.lang.Exception: Caught an exception
	at Syntax.rethrow.Rethrow.rethrowException(Rethrow.java:18)
	at Syntax.rethrow.Rethrow.main(Rethrow.java:33)
Caused by: java.lang.UnsupportedOperationException
	at Syntax.rethrow.Rethrow.generateException(Rethrow.java:9)
	at Syntax.rethrow.Rethrow.rethrowException(Rethrow.java:15)
	... 1 more
-=========================
java.lang.UnsupportedOperationException
	at Syntax.rethrow.Rethrow.generateException(Rethrow.java:9)
	at Syntax.rethrow.Rethrow.rethrowExceptionDestroyOriginalCallstack(Rethrow.java:24)
	at Syntax.rethrow.Rethrow.main(Rethrow.java:39)

 

As you can see, the 

 

throw e;

 may potentially destroy neccessary information. in this case, it is because of the UnsupportedOperationException that cause the program to fail in the first place. 

 

so it is recommended to alwasy to throw with proper inner exception constructed. 

分享到:
评论

相关推荐

    rethrow:重新抛出与模板渲染,编译或其他处理相关的错误,以获取报告

    var rethrow = require ( 'rethrow' ) ; 有关用法示例,请参见。 原料药 在上下文中将给定的err重新抛出给给定lineno filename中有问题的模板表达式。 参量 err {Error} :错误对象 filename {String} :模板的...

    模板错误:使lo-dashunderscore模板错误易于理解和修复

    var rethrow = require ( 'template-error' ) ; rethrow ( '\n<%= a %>\n<%= b %>' , { data : { a : 'aaa' } } ) ; 当未定义模板变量时(例如上例中的<%= b %> ,而不是得到一条神秘的错误...

    Java_Programming_Exception_Example_code.rar_advanced java_java p

    `Exception`类是Java异常处理的核心,它位于`java.lang`包中,是所有检查型异常(checked exceptions)的基类。当我们遇到程序运行时可能出现的错误或异常情况时,会抛出一个异常对象。在本例中,"Java_Programming_...

    JAVA 7新特性1

    JAVA 7 新特性 —— 异常处理升级 JAVA 7 中引入了多个新特性,其中之一是异常处理升级。在 Java 7 中,catch 代码块得到了升级,可以在单个 catch 块中处理多个异常。这种特性可以减少代码重复度,并生成更少的...

    java程序实例 事件处理

    **示例四:RethrowException.java** ```java public class RethrowException { public static void f() throws Exception { System.out.println("the original exception in f()"); throw new Exception("thrown...

    JavaPDF生成文档的总结及相关代码,Java生成PDF

    JavaPDF生成文档是一种常见的技术,尤其在企业级应用中,用于生成报告、发票、合同等正式文件。在Java中,有多个库可以帮助我们创建PDF文档,例如iText、Apache PDFBox、Flying Saucer等。本篇文章将深入探讨如何...

    Java教学中存在的问题及建议.pdf

    * Java 7版本中新增了Modularization模块化、对动态语言的支持、更多新的I/O APIs、对XML本地语言支持、Safe rethrow、Null dereference expressions、更好的类型推断、多重捕获Multi-catch、Swing应用框架等新特性...

    Beginning Java 7

    ### Java 7 入门详解 #### 一、Java 7 概览 Java 7 是 Java 编程语言的一个重要版本,它引入了一系列新特性与改进,旨在提高开发效率和程序性能。本书《Beginning Java 7》为读者提供了一个全面的学习路径,不仅...

    testers-rethrow

    测试者一掷千金 描述 不同测试人员: 将异常抛出另一个异常。 将异常抛出到catch中-相同的异常。 抛出异常到catch中-两种不同的异常。 将日志错误扔到catch中。... 将日志错误扔到catch中。... :)

    Java throw Exception实现异常转换

    RethrowException是Java throw Exception实现异常转换的另一个实现方式。它使用类型推断来将checked exception转换为unchecked exception。下面是一个示例代码: ```java public class RethrowException { public ...

    Java程序设计:chapter10 异常处理.ppt

    Java程序设计中的异常处理是确保程序健壮性和稳定性的关键机制。异常是在程序运行时遇到的不正常情况或错误,例如除数为零、数组越界等,它们会导致程序中断执行。异常处理主要包括以下几个方面: 1. **异常处理...

    Java基础之异常处理操作示例

    Java 异常处理操作示例 Java 异常处理是 Java 编程语言中的一项重要机制,用于处理程序执行中出现的异常情况。Java 异常处理操作示例主要介绍了 Java 基础之异常处理操作,涉及 Java 异常捕获、抛出异常、自定义...

    nodejs-mysql

    在IT领域,特别是Web开发与后端服务设计中,Node.js与MySQL的结合是一种常见的技术栈选择,尤其在Linux环境下,这种组合提供了高效、灵活的数据处理能力。以下将深入解析如何在Linux系统下利用Node.js连接并操作...

    staf+stax hands on

    - `<throw>` 和 `<rethrow>`:用于在脚本中引发或重新抛出异常。 2. **函数定义与调用**: - `<function>`:定义可重复使用的函数。 - `<call>`:调用已定义的函数。 - `<return>`:从函数返回值。 - `...

    Dart基础语法.pdf

    这些关键字是Dart语言特有的,不在Java等其他语言中出现。 - `deferred`: 标注库加载行为。 - `as`: 类型转换。 - `assert`: 断言。 - `dynamic`: 动态类型。 - `sync*`: 同步迭代器。 - `async`: 异步函数。 - `...

    java8看不到源码-findbugs-slf4j:一个SpotBugs/FindBugs插件来验证SLF4J的使用

    java8 看不到源码SLF4J 的 FindBugs 错误模式 本产品可帮助您验证 SLF4J 1.6、1.7 和 1.8 的使用情况。 适用于 Java8 及更高版本。 要将此插件与 SonarQube 一起使用,请参阅 。 要在编译时检测问题,请参阅 。 动机...

    freemarker\Freemarker教程_中文版

    cfg.setDirectoryForTemplateLoading(new File("/path/to/templates")); cfg.setDefaultEncoding("UTF-8"); cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER); ``` ### 2. 数据模型...

    Exception

    而Exceptions是程序可以预见和处理的错误,分为检查型异常(Checked Exceptions)和运行时异常(Unchecked Exceptions)。 检查型异常是那些在编译时需要处理的异常,例如IOException、SQLException等。如果可能抛...

    ebt_limit.rar_limit

    3. **rethrow4.c** - 这个文件显然涉及到了重新抛出异常的测试,可能包含四种不同的rethrow情况,比如在不同级别的try-catch块中,或者在不同的上下文中进行rethrow。 综合这些信息,我们可以推断"ebt_limit.rar_...

    编程规范1

    - 当捕获到异常时,可以使用 `rethrow` 语句重新抛出,以便上层代码处理,如 `try...catch` 结构中的 `rethrow`。 这些规范旨在提高代码质量和一致性,使得代码更易于理解和维护。在实际开发中,应始终遵循这些...

Global site tag (gtag.js) - Google Analytics