如何在 Java 中捕获 AWT 线程异常?

     2023-03-27     279

关键词:

【中文标题】如何在 Java 中捕获 AWT 线程异常?【英文标题】:How can I catch AWT thread exceptions in Java? 【发布时间】:2010-09-10 21:07:00 【问题描述】:

我们希望在我们的应用程序日志中跟踪这些异常 - 默认情况下,Java 只是将它们输出到控制台。

【问题讨论】:

【参考方案1】:

从 Java 7 开始,您必须采取不同的做法,因为 sun.awt.exception.handler hack 不再起作用。

Here is the solution(来自Uncaught AWT Exceptions in Java 7)。

// Regular Exception
Thread.setDefaultUncaughtExceptionHandler(new ExceptionHandler());

// EDT Exception
SwingUtilities.invokeAndWait(new Runnable()

    public void run()
    
        // We are in the event dispatching thread
        Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler());
    
);

【讨论】:

根据你链接的来源,如果它与所有线程的默认UncaughtExceptionHandler相同,则不需要专门为EDT设置UncaughtExceptionHandler。 我的例子不太现实(同样UncaughtExceptionHandler),问题是你可以为EDT设置一个特定的UncaughtExceptionHandler 但是是的,您也可以设置一次默认处理程序并在此处管理异常(无论您是否在 EDT) 如果一个新的 EDT 被启动,例如一个模态对话框,你会怎么做?有没有办法得到通知? 我不是 AWT 专家,但可以运行多个 EDT 吗?【参考方案2】:

在 EDT 内和 EDT 外未捕获的异常是有区别的。

Another question has a solution for both 但如果您只想咀嚼 EDT 部分...

class AWTExceptionHandler 

  public void handle(Throwable t) 
    try 
      // insert your exception handling code here
      // or do nothing to make it go away
     catch (Throwable t) 
      // don't let the exception get thrown out, will cause infinite looping!
    
  

  public static void registerExceptionHandler() 
    System.setProperty('sun.awt.exception.handler', AWTExceptionHandler.class.getName())
  

【讨论】:

无需捕获可投掷物。不会有无限循环。 java.awt.EventDispatchThread.handleException 正在为您捕获任何异常。 那里说classs AWTExceptionHandler【参考方案3】:

shemnon的回答的一点补充: 第一次在 EDT 中发生未捕获的 RuntimeException(或错误)时,它正在寻找属性“sun.awt.exception.handler”并尝试加载与该属性关联的类。 EDT 需要 Handler 类有一个默认的构造函数,否则 EDT 不会使用它。 如果您需要在处理故事中引入更多动态,则必须使用静态操作来执行此操作,因为该类是由 EDT 实例化的,因此没有机会访问静态以外的其他资源。这是我们正在使用的 Swing 框架中的异常处理程序代码。它是为 Java 1.4 编写的,在那里运行良好:

public class AwtExceptionHandler 

    private static final Logger LOGGER = LoggerFactory.getLogger(AwtExceptionHandler.class);

    private static List exceptionHandlerList = new LinkedList();

    /**
     * WARNING: Don't change the signature of this method!
     */
    public void handle(Throwable throwable) 
        if (exceptionHandlerList.isEmpty()) 
            LOGGER.error("Uncatched Throwable detected", throwable);
         else 
            delegate(new ExceptionEvent(throwable));
        
    

    private void delegate(ExceptionEvent event) 
        for (Iterator handlerIterator = exceptionHandlerList.iterator(); handlerIterator.hasNext();) 
            IExceptionHandler handler = (IExceptionHandler) handlerIterator.next();

            try 
                handler.handleException(event);
                if (event.isConsumed()) 
                    break;
                
             catch (Throwable e) 
                LOGGER.error("Error while running exception handler: " + handler, e);
            
        
    

    public static void addErrorHandler(IExceptionHandler exceptionHandler) 
        exceptionHandlerList.add(exceptionHandler);
    

    public static void removeErrorHandler(IExceptionHandler exceptionHandler) 
        exceptionHandlerList.remove(exceptionHandler);
    


希望对你有帮助。

【讨论】:

【参考方案4】:

有两种方式:

    /* 在 EDT 上安装 Thread.UncaughtExceptionHandler */ 设置系统属性: System.setProperty("sun.awt.exception.handler",MyExceptionHandler.class.getName());

我不知道后者是否适用于非 SUN jvm。

--

确实,第一个是不正确的,它只是一种检测崩溃线程的机制。

【讨论】:

使用 Thread.UncaufhtExceptionHandler 不会捕获 EDT 异常。 EDT 类捕获所有可抛出对象并将它们打印出来,而不是让它们展开整个线程。 您还缺少有关第二个选项中所需内容的详细信息,MyExceptionHandler 类必须具有可访问的句柄(Throwable)实例方法和可访问的无参数构造函数。

如何从线程中捕获异常

】如何从线程中捕获异常【英文标题】:HowtocatchanExceptionfromathread【发布时间】:2011-09-2615:13:12【问题描述】:我有Java主类,在类中,我启动了一个新线程,在主类中,它一直等到线程死亡。在某个时刻,我从线程中抛出了运行... 查看详情

线程“主”java.awt.AWTError 中的异常:未找到辅助技术

...hnologynotfound【发布时间】:2013-03-0700:36:59【问题描述】:如何解决这个错误?:com.sun.java.accessibility.AccessBridge在java.awt.Toolkit.l 查看详情

为啥在这个多线程示例中没有捕获到异常?

...布时间】:2021-04-1310:31:09【问题描述】:我试图了解异常如何在多线程中传播。问题在下面的例子中。为什么RuntimeException异常没有被捕获`System.out.println("Exceptionhandled 查看详情

java子线程中的异常处理(通用)

...。那么,在并发情况下,比如在父线程中启动了子线程,如何在父线程中捕获来自子线程的异常,从而进行相应的处理呢?常见错误也许有人会觉得,很简单嘛,直接在父线程启动子线程的地方try...catch一把就可以了,其实这是... 查看详情

捕获未处理的线程异常

...布时间】:2011-05-2021:38:04【问题描述】:你们中有人知道如何在应用程序的主线程中捕获特定线程中引发的异常吗?例如,我有一个非常简单的线程来做一些基本的事情:tryThreadt=newThread(newThreadStart(Cache.initialize));t.Start();t.Name="lo... 查看详情

commonruntimeexception错误怎么捕获

JAVA子线程中的运行时异常(RuntimeException)捕获转载2019-04-2415:21:08Zebul博码龄9年关注转自:https://www.cnblogs.com/chenfei0801/archive/2013/04/23/3039286.html在java多线程程序中,所有线程都不允许抛出未捕获的checkedexception(比如sleep时的InterruptedE... 查看详情

在 Java 参数中捕获异常

...nJavaparameters【发布时间】:2017-12-2721:15:54【问题描述】:如何在Java中捕获异常参数只是一个例子,在这样的代码中MyClassobj=null;logger.info("thefieldis"+obj.field);抛出空指针异常。有没有办法自动做到这一点:MyClassobj=null;trylogger.info("th... 查看详情

java中捕获异常

...le主要包括两个大类。Error类和Exception类。Error类异常无法捕获(是JVM异常或线程死锁)。Exception分两类非检查异常(RuntimeException)和检查异常(非运行时异常)。在java中如果不对异常进行处理,程序就会因为异常而终止。如果通过try-cat... 查看详情

如何在 FutureTask 中捕获异常

】如何在FutureTask中捕获异常【英文标题】:HowtocatchexceptionsinFutureTask【发布时间】:2011-04-0302:07:28【问题描述】:在发现FutureTask在Java1.6(和来自Eclipse)上运行在Executors.newCachedThreadPool()中会吞下Runnable.run()方法中的异常后,我试... 查看详情

捕获在不同线程中抛出的异常

】捕获在不同线程中抛出的异常【英文标题】:catchexceptionthatisthrownindifferentthread【发布时间】:2011-08-2410:28:01【问题描述】:我的一个方法(Method1)产生了一个新线程。该线程执行一个方法(Method2),并在执行期间引发异常。我... 查看详情

如何捕获 JNI/Java 异常

】如何捕获JNI/Java异常【英文标题】:HowtocatchJNI/JavaException【发布时间】:2010-01-1305:14:53【问题描述】:我的应用程序中有一个JNI层。在某些情况下,Java会引发异常。如何在JNI层中获取Java异常?我的代码如下。if((*(pConnDA->penv)... 查看详情

如何在 Java 6 中捕获所有已检查的异常(在一个块中)?

】如何在Java6中捕获所有已检查的异常(在一个块中)?【英文标题】:Howtocatchallcheckedexceptions(inasingleblock)inJava6?【发布时间】:2013-01-2403:22:07【问题描述】:重要提示:此问题仅与Java6(及以下)有关。层次结构here显示JavaExcept... 查看详情

为啥不能在主线程中直接捕获和处理工作线程抛出的异常?

】为啥不能在主线程中直接捕获和处理工作线程抛出的异常?【英文标题】:WhyisitnotpossibletodirectlycatchandhandleanexceptionthrownfromaworkerthreadintheMainthread?为什么不能在主线程中直接捕获和处理工作线程抛出的异常?【发布时间】:2021... 查看详情

在 WPF 的子线程中捕获未处理的异常

】在WPF的子线程中捕获未处理的异常【英文标题】:CatchingUnhandledExceptionsinChildThreadsinWPF【发布时间】:2010-11-2813:25:37【问题描述】:我有一个分离多个线程的WPF应用程序。我在App.xaml.cs中定义了一个DispatcherUnhandledException事件处... 查看详情

捕获在不同线程中运行的方法异常的正确方法是啥?

】捕获在不同线程中运行的方法异常的正确方法是啥?【英文标题】:What\'stheproperwayofcatchinganexceptionofmethodrunninginadifferentthread?捕获在不同线程中运行的方法异常的正确方法是什么?【发布时间】:2015-01-2107:50:48【问题描述】:... 查看详情

在调用者线程中捕获线程的异常?

】在调用者线程中捕获线程的异常?【英文标题】:Catchathread\'sexceptioninthecallerthread?【发布时间】:2011-02-1905:39:46【问题描述】:总的来说,我对Python和多线程编程非常陌生。基本上,我有一个脚本可以将文件复制到另一个位置... 查看详情

捕获不同线程中引起的异常[重复]

】捕获不同线程中引起的异常[重复]【英文标题】:Catchingexceptionscausedindifferentthreads[duplicate]【发布时间】:2013-06-2207:19:40【问题描述】:以下示例是对我的问题的简化。在新线程中引发异常。如果我没有在线程中处理它,它不... 查看详情

macos中某些应用程序的java屏幕截图

...活动屏幕中。我可以使用以下代码进行活动屏幕捕获,但如何捕获给定的应用程序?importjava.awt.AWTException;importjava.awt.Robot;importjava.awt.Rectangle;importjava.awt.Toolkit;importjava.awt.image.Buffe 查看详情