2013-06-28 169 views
1
  • 異常處理的目的不是爲了處理與異步事件(例如,磁盤I/O完成,網絡消息到達,鼠標單擊和擊鍵)相關的問題,這些異步事件與程序的流程並行且獨立於流程的控制。

如何異常處理不是設計來處理異步事件?爲什麼會這樣?爲什麼異常處理不能處理異步事件?

,如果你通過很詳細的例子增強你的答案我應該心存感激。

+1

你能提供你的源?異步事件引起的異常也可以用適當的設計來處理。 – assylias

+0

所以,我們不能使用PrimeNumbersFoundException知道,如果A = B * C在同一時間有什麼素數? –

+0

@assylias看起來像「Jave For Programmers」http://books.google.com/books?id=Xq9P8xly6iUC&pg=PA301&lpg=PA301&dq=%22Exception+handling+is+not+designed+to+process+problems+associated+with +異步%22&source = bl&ots = -AJ6ABwzFd&sig = JynRXmydQ-w9LWDLuenLKOiSUqc&hl = en&sa = X&ei = 2IfNUbzNBonJ0QHbioGQDQ&dd=0CDAQ6AEwAQ – CPerkins

回答

2

我認爲這是一個誤導性的陳述。

異步工作方式是通過Java線程完成(或進程但那是另一回事)。

什麼是真實的是,如果你啓動一個線程,並在該線程中引發異常,你將無法從你的主線程捕獲它。

但沒有什麼能阻止你在新線程處理異常。

實施例 - 下面打印Exception was raised in the thread but we can still handle it的代碼:

public static void main(String[] args) throws Exception { 
    Thread t = new Thread(new Runnable() { 

     @Override 
     public void run() { 
      throw new RuntimeException("oops"); 
     } 
    }); 
    t.setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 

     @Override 
     public void uncaughtException(Thread t, Throwable e) { 
      System.out.println("Exception was raised in the thread but we can still handle it"); 
     } 
    }); 

    t.start(); 
} 

或者,也可以在可運行本身內添加一些異常捕獲邏輯。