`
Qieqie
  • 浏览: 339992 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

异步调用时,异常rethrow的编程模式

阅读更多

今天看到的一个问题,顺便总结如下:

 

Java编程中,程序异常处理是一个跑不掉的东西。

 

对于同步编程:

调用某个可能抛出checkedunchecked异常的方法时,可以直接在方法中声明throws继续往上处理,也可以在本方法中进行try catch处理(比如进行日志登记)

catch处理后,是否进行throw ethrow new XxxException(e)视具体情况而定。这些处理,从技术上都是正确的,我们也处理地很好。问题不在这。

 

对于异步编程(重点)

在线程A中,从底层的Thread.run一直运行调用到某个方法xxx()xxx()设置线程之间的共享对象并notify通知另外一个线程B处理输入的任务,

如果任务失败时 (比如验证错误、程序空指针错误、超时错误等等)

这样情况下,通常按照以下判断程序的好坏:

1、 差的做法:A线程无法收到失败通知,也就是B线程产生的异常对象无法通知到A,使A无法接收该异常;

2、 好的做法:B的异常能够被A接收到!技术上是B发生异常时,要把异常记录到某共享对象,然后B线程通知A线程取回该异常。

 

但,xxx()获取到B的异常后,如何处理呢?分为3种情况:

1、 xxx() 自己try catch处理掉 — 没问题,如果真的应该由它处理的话

2、xxx() 需要把这个异常rethrow出去给上级调用者,
此时要注意了请不要简单这样写throw exceptionFromThreadB而应该写成这样:throw new XxxException(exceptionFromThreadB);

3、 如果第1步的try catch中需要做logger.error记录,也请这样记录logger.error(“”, new XxxException(exceptionFromThreadB));不写成logger.error(“”, exceptionFromThreadB);

 

为什么?

 

一个异常对象,意味着JVM dump出的当时的堆栈调用情况。throw rethrow出去的意味着,让上级了解当时这个堆栈。

如果只是throw/log.error exceptionFromThreadB,那么从后台的日志文件中,并不能看出原来是xxxx()这个方法进行异步调用发生的异常,更不知道是xxx()里面的具体哪一个步骤、哪一个代码调用的异步调用。

这会耽误程序的调试,问题的解决。

 

 

rethrowlog异常的同学多留意一下

分享到:
评论
2 楼 xibaluma 2009-06-25  
[quote="Qieqie"]
[size=13px; font-family: tahoma;]
今天看到的一个问题,顺便总结如下:[/size]


LZ稍微讲的晦涩了点 我还没看懂 。
1 楼 ▄︻┳═一 2009-06-25  
引用
一个异常对象,意味着JVM dump出的当时的堆栈调用情况。throw 或rethrow出去的意味着,让上级了解当时这个堆栈。

如果只是throw/log.error exceptionFromThreadB,那么从后台的日志文件中,并不能看出原来是xxxx()这个方法进行异步调用发生的异常,更不知道是xxx()里面的具体哪一个步骤、哪一个代码调用的异步调用。

这会耽误程序的调试,问题的解决。


如果仅仅是出于调试目的,为什么不把打logger的类名和行号输出,而采用这种方式呢?

相关推荐

    C#中的异常处理

    在C#编程中,异常处理是一项至关重要的技术,它允许开发者在程序运行时优雅地处理错误情况,防止程序因未预期的问题而崩溃。本节将深入探讨C#中的异常处理概念,包括如何捕获和处理异常,以及C#特有的异常类、抛出和...

    C++Exception 异常处理 源码

    当异常发生并离开作用域时,所有自动对象的析构函数都会被调用,无论它们是否抛出异常。这是C++异常处理的一个重要特性,确保资源的正确释放。 11. **异常规范的缺点**: 虽然`noexcept`能提供编译时的异常检查,...

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

    如果`catch`块不能完全处理异常,可以选择重新抛出(rethrow)异常,这样上层的调用者可以处理。这可以通过`throw`关键字实现,也可以使用`throw e`来直接抛出捕获到的异常对象。 5. **异常对象的生成**: 当异常...

    Java_Programming_Exception_Example_code.rar_advanced java_java p

    在"Java高级编程RethrowException代码.rar"中,我们可以看到如何处理和重新抛出异常。在Java中,`try-catch`块用于捕获和处理异常。`try`块包含可能抛出异常的代码,`catch`块用于捕获并处理这些异常。如果在`try`块...

    实验7(异常).zip

    此外,`std::current_exception`函数可以获取当前正在处理的异常对象的引用,而`std::rethrow_exception`则可以再次抛出该异常,这对于在不同`catch`块之间传递异常非常有用。 在实验中,你可能会编写一段代码,...

    ebt_limit.rar_limit

    在编程中,异常是一种在程序运行时发生的错误或不正常的情况,它会中断正常的执行流程。当出现异常时,程序可以选择捕获(catch)并处理异常,或者让异常继续传播,直到被其他合适的代码块处理,或者导致程序终止。 ...

    linux程序栈回溯

    当一个异常被抛出时,编译器会自动维护一个异常处理表,记录了抛出异常时的调用栈信息。通过捕获`std::current_exception`,然后使用`std::rethrow_exception`,可以重新触发异常并进行栈回溯。 在生产环境中,为了...

    C++中的意外处理技术

    在C++编程中,意外处理是一项至关重要的技术,它确保了程序在遇到错误或异常情况时仍能保持稳定性和可靠性。异常处理是C++中的一种机制,用于在程序执行过程中捕获并处理运行时错误。下面我们将深入探讨C++中的异常...

    异常机制分析

    在C++编程中,异常处理机制是一项重要的功能,它允许程序员在程序出现错误时能够捕获这些错误,并作出适当的响应。异常处理的基本思想是通过`try`、`catch`、`throw`关键字来实现,其中`try`用来标记一段可能发生...

    The C++ Programming Language(ch 14)

    其基本思想是:当一个函数发现它无法解决的问题时,会抛出一个异常,希望它的直接或间接调用者能够处理这个问题。希望处理这类问题的函数可以通过声明捕获特定类型的异常来表明自己的意愿(参见第2.4.2节和第8.3节)...

    C#中的异常处理细节

    在C#编程语言中,异常处理是至关重要的一个部分,它确保了程序在遇到错误时能够优雅地处理问题,而不是突然崩溃。本文将深入探讨C#中的异常处理机制,特别是`throw`和`throw ex`的用法以及“捕获并抛出”(catch and ...

    C# 编程规范大全

    ### C# 编程规范详解 #### 概述 C#是一种现代的、面向对象的编程语言,由微软公司开发并广泛应用于各种软件项目的开发之中。为了提高代码质量、增强可读性和可维护性,遵循一定的编程规范是非常必要的。本文档旨在...

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

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

    Visual C ++中的有效异常处理

    10. **异常传播**:如果一个函数在其调用的子函数中捕获了异常,它可以选择重新抛出(rethrow)该异常,这使得异常可以沿着调用栈向上传播,直到找到合适的处理程序。 通过有效地利用Visual C++的异常处理机制,...

    编程规范1

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

    .NET(C#):Emit创建异常处理的方法

    .NET框架的动态方法生成是通过...这种方法在某些高级编程场景中非常有用,例如元编程、编译器实现或自定义运行时行为。然而,由于其底层性质,Emit需要对IL指令集有深入的理解,使用不当可能会导致难以调试的问题。

    Dart基础语法.pdf

    这些关键字增强了Dart的异步编程能力。 - `async`: 标记一个函数为异步。 - `async*`: 用于定义异步迭代器。 - `await`: 在异步函数中等待一个Future。 - `sync*`: 用于定义同步迭代器。 - `yield`: 生成器函数中...

    SSD5 Recommended Exercise 3

    异常处理可以分为三个部分:抛出(throw)、捕获(catch)和重新抛出(rethrow)。通过这种方式,我们可以确保程序即使在遇到错误时也能优雅地终止,而不是突然崩溃。 5. **“handout-files”**:这个文件夹可能...

    Exception

    在Java编程语言中,"Exception"是一个至关重要的概念,它代表了程序运行过程中出现的异常情况。异常是程序运行时的错误,不同于语法错误,它们通常发生在程序执行期间,可能是由于资源不足、非法操作或者逻辑错误...

Global site tag (gtag.js) - Google Analytics