Android 동시 프로그래밍 3-- 예외

18128 단어
개발 과정에서 이상은 불가피하게 발생한다. 포획 이상에 대해 보통 주선정에서 포획하지만 자선정에서 발생하는 이상에 대해 주선정은try-catch를 통해 포획할 수 없기 때문에 UncaughtExceptionHandler를 사용하여 전역적으로 이상을 포획해야 한다.
1、UncaughtExceptionHandler
일단 코드를 한번 볼게요.
public static void main(String[] args) {
        try {

            new Thread(new ThreadException(),"Thread-1").start();
            new Thread(new ThreadException(),"Thread-2").start();
            new Thread(new ThreadException(),"Thread-3").start();

        }catch (RuntimeException e){
            System.out.println("      ");
        }


    }

    @Override
    public void run() {
        //          
        throw new RuntimeException();
    }

우리의 생각에 따라 주 라인에서try-catch 코드 블록을 사용하여 이상을 포착할 수 있다. 이상을 포착할 수 있다면catch 코드 블록의 코드를 출력하지만 그렇지 않다.
Exception in thread "Thread-1" Exception in thread "Thread-3" java.lang.RuntimeException
	at thread_core.exception.ThreadException.run(ThreadException.java:22)
	at java.base/java.lang.Thread.run(Thread.java:834)
Exception in thread "Thread-2" java.lang.RuntimeException
	at thread_core.exception.ThreadException.run(ThreadException.java:22)
	at java.base/java.lang.Thread.run(Thread.java:834)
java.lang.RuntimeException
	at thread_core.exception.ThreadException.run(ThreadException.java:22)
	at java.base/java.lang.Thread.run(Thread.java:834)

이는 자선정에서 발생한 이상으로 주선정에서 포착되지 않았기 때문에 이것도 인출UncaughtExceptionHandler의 원인이다.
해결 방법 1 (추천하지 않음): 하위 라인에서try-catch가 비정상적으로 처리됩니다.
@Override
    public void run() {
        try {
            //          
            throw new RuntimeException();
        }catch (RuntimeException e){
            System.out.println("      ");
        }
    }
      
      
      

해결 방법 2: 사용자 정의 예외 캡처기 UncaughtExceptionHandler
public class MyUncaughtExceptionHandler 
        implements Thread.UncaughtExceptionHandler {
    
    private String msg;
    public MyUncaughtExceptionHandler(String msg){
        this.msg = msg;
    }
    @Override
    public void uncaughtException(Thread thread, Throwable throwable) {
        Logger logger = Logger.getAnonymousLogger();
        logger.log(Level.WARNING,"    "+thread.getName());

        System.out.println(msg+"   "+thread.getName()+" "+throwable+"  ");
    }
}
public class UncaughtHandlerRunnable implements Runnable {

    public static void main(String[] args) {
    	//         
        Thread.setDefaultUncaughtExceptionHandler(new MyUncaughtExceptionHandler("   1"));
        new Thread(new UncaughtHandlerRunnable()).start();
        new Thread(new UncaughtHandlerRunnable()).start();
        new Thread(new UncaughtHandlerRunnable()).start();
    }

    @Override
    public void run() {
        throw new RuntimeException();
    }
}

6  04, 2020 10:34:59    thread_core.exception.MyUncaughtExceptionHandler uncaughtException
  :     Thread-2
6  04, 2020 10:34:59    thread_core.exception.MyUncaughtExceptionHandler uncaughtException
  :     Thread-0
6  04, 2020 10:34:59    thread_core.exception.MyUncaughtExceptionHandler uncaughtException
  :     Thread-1
   1   Thread-2 java.lang.RuntimeException  
   1   Thread-1 java.lang.RuntimeException  
   1   Thread-0 java.lang.RuntimeException  

이렇게 하면 주 라인에서도 전역에 나타나는 이상 정보를 포착할 수 있다.

좋은 웹페이지 즐겨찾기