0

我正在创建未经检查的异常。我所看到的是大多数异常都调用 super()。所以我遵循了类似的模式。

我想知道如何处理未经检查的异常(系统定义和自定义)以用于记录目的、恢复应用程序或从该特定方法或任何其他自定义工作?

我正在研究多线程环境(套接字编程)。创建一个主线程,它将创建一个网络服务,该服务将创建一个 ThreadPoolExecutor 并打开套接字并在 while 循环中接受它并将任务发送到由 ThreadPoolExecutor 创建的线程。现在,如果一个线程抛出未经检查的异常,那么根据未经检查的异常的严重程度,我会杀死该线程或继续原样,但在两种情况下都记录。

我将只创建未经检查的异常。如果我捕捉到未经检查的异常,那么将其设为未经检查是没有意义的。那么有什么办法可以解决这个问题。

在 Spring 中,我使用 @ControllerAdvice 和 @ExceptionHandler 来管理未经检查的异常。但我不确定如何在套接字编程中执行此操作。请用你的经验给我建议和指导。

另外,我看到许多框架,如 Spring、Hibernate 正在通过将 Checked Exception 包装在 Unchecked Exception 中来向 Unchecked Exceptions 发展。

请不要建议我使用已检查的异常,因为这是一个有争议的话题。对不起。

4

3 回答 3

1

您要做的是使用Thread.setDefaultUncaughtExceptionHandler()Thread.setUncaughtExceptionHandler()功能。

您可以在Thread级别,ThreadGroup级别和Runtime级别设置处理程序。

设置当线程由于未捕获的异常而突然终止时调用的默认处理程序,并且没有为该线程定义其他处理程序。未捕获的异常处理首先由线程控制,然后由线程的 ThreadGroup 对象控制,最后由默认的未捕获异常处理程序控制。如果线程没有明确的未捕获异常处理程序集,并且线程的线程组(包括父线程组)没有专门化其 uncaughtException 方法,则将调用默认处理程序的 uncaughtException 方法。

通过设置默认的未捕获异常处理程序,应用程序可以更改那些已经接受系统提供的任何“默认”行为的线程处理未捕获异常的方式(例如记录到特定设备或文件)。

请注意,默认的未捕获异常处理程序通常不应遵循线程的 ThreadGroup 对象,因为这可能导致无限递归。

这是以通用方式处理致命错误的最佳方法,不会丢失与异常源关联的堆栈跟踪。

于 2013-09-11T08:46:57.317 回答
0

未经检查的异常通常保留给不可恢复的异常。

但是,如果您需要捕获未经检查的异常,您可以在线程的 Run 方法中捕获 Throwable,因为所有异常都扩展 Throwable。

但是当你在这个级别抓住它时,你将无法恢复。你唯一能做的就是记录它。

于 2013-09-11T08:42:05.890 回答
-1

如果您要创建自定义异常类,我建议的最简单方法是扩展Exception类。

由于 Exception 类由编译时和运行时异常类扩展。因此,您可以捕获编译时和运行时异常。

于 2013-09-11T09:28:40.293 回答