كيف يمكنني التقاط استثناءات مؤشر ترابط AWT في Java؟

StackOverflow https://stackoverflow.com/questions/95767

سؤال

نود أن نتتبع هذه الاستثناءات في سجلات التطبيق لدينا - بشكل افتراضي، تقوم Java بإخراجها إلى وحدة التحكم فقط.

هل كانت مفيدة؟

المحلول

هناك فرق بين الاستثناءات التي لم يتم اكتشافها في EDT وخارجها.

سؤال آخر لديه حل لكليهما ولكن إذا كنت تريد فقط مضغ جزء 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 7، يتعين عليك القيام بذلك بشكل مختلف كما هو الحال مع sun.awt.exception.handler الاختراق لا يعمل بعد الآن.

هنا هو الحل (من استثناءات AWT غير المكتشفة في 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());
    }
});

إضافة صغيرة ل شيمنونالجواب:
في المرة الأولى التي يحدث فيها RuntimeException (أو خطأ) لم يتم اكتشافه في EDT، فإنه يبحث عن الخاصية "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);
    }

}

نأمل أن يساعد.

هناك طريقتان:

  1. /* تثبيت Thread.UncaughtExceptionHandler على EDT */
  2. تعيين خاصية النظام:System.setProperty("sun.awt.exception.handler",MyExceptionHandler.class.getName());

لا أعرف ما إذا كان هذا الأخير يعمل على أجهزة jvms غير تابعة لـ SUN.

--

في الواقع، الأول غير صحيح، فهو مجرد آلية للكشف عن الخيط المعطل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top