2012-10-11 146 views
0

我在找上如何處理Java異常的情況下的建議,其中Java自定義異常處理

Class A.test() 
{ 
    ClassB.test1() 
} 


test1() 
{ 
    Map listOfExceptions = new HashMap(); 
    for() 
    { 
     try{ 
     } 
     catch(custException e){ 
     // I want the for loop to continue even if there is an exception 
     //So I am not throughing now rather adding the exception message to map with 
     //the field name for which for loop is running as key and message as value 
     { 
    } 

// at some point if map has >0 records I want to throw an exception to classA. 
} 

所以這裏的問題是我怎麼可以在地圖數據添加到拋出的異常?基本上我需要將異常列表發送到調用方法,作爲異常處理的一部分。 有沒有辦法可以做到這一點? 如果答案是衆所周知的,這可能是一個非常愚蠢的問題,但我力求在任何地方找到確切的答案。

+0

是這個java代碼? – Prasanth

+0

此Java代碼不會編譯。 – 2012-10-11 08:19:23

+3

我認爲(公平)這是Java-ish僞代碼 –

回答

7

爲什麼不在迭代時只生成List<Exception>?然後在完成時拋出CustomException(源自Exception),如果該列表不是空的,則在CustomException中提供List<Exception>作爲字段。

您可能不想存儲List<Exception>,而是List<Info>,其中Info表示導致異常的數據。這可能會更輕。

更好的是,創建一個ErrorCollator對象,您可以將其添加到Exceptions。完成後,請致電ErrorCollator.throwExceptionIfReqd(),並且該對象本身可以確定是否拋出異常(簡單地說,如果List不爲空)。這樣你就有了一個可重複使用的組件/模式,你可以持續使用。也許值得努力,如果不立即做。

+0

謝謝布賴恩,這有幫助。 – Swagatika

0

創建一個自定義異常類像

Class CustomException extends Exception{ 

Map listOfExceptions; 


CustomException (Map m){ 
    ListofExceptions=m; 
} 
} 

現在拋出這個客戶異常,當記錄> 0或任何其它條件。

throw new CustomException(listOfExceptions); 
0

退房的,你怎麼能一個特例到一個HashMap下面的代碼

public class ClassA { 

    HashMap hm = new HashMap(); //HashMap Object that holds Exceptions 

    public ClassA(){ 
     try { 
      runA(); 
     } catch (Exception ex) { 
      hm.put("a", ex); //put Exception in HashMap 
     } 
     try { 
      runB(); 
     } catch (Exception ex) { 
      hm.put("b", ex); //put Exception in HashMap 
     } 
    } 

    private void runA() throws Exception { 
     throw new Exception("a"); //Generate exception a 
    } 

    private void runB() throws Exception { 
     throw new Exception("b"); //Generate exception b 
    } 
} 

然後你就可以通過提供一些吸氣功能,讓您的HashMap對象,並使用該循環擴展此類(迭代器)可以迭代它:

// Get a set of the entries 
Set set = hm.entrySet(); 
// Get an iterator 
Iterator i = set.iterator(); 
// Display elements 
while(i.hasNext()) { 
    Map.Entry me = (Map.Entry)i.next(); 
    System.out.print(me.getKey() + ": "); 
    System.out.println(me.getValue()); 
} 
0

請嘗試下面的代碼。在我的示例代碼中,我將一個String解析爲int。

直到數組結束,解析仍在繼續。如果發生異常,則將其放到 圖上。該映射包含for循環正在以 鍵和異常消息作爲值運行的字段名稱。

在數組末尾,檢查映射是否需要拋出異常調用類 。

public class ExceptionHadlingTest { 

    public static void main(String[] args) { 
     A1 a1 = new A1(); 
     a1.test(); 
    } 
} 
class A1 { 
    public void test() { 

     B1 b1= new B1(); 
     try { 
      b1.test1(); 
     } catch (Exception e) { 
     } 
    } 
} 

class B1 { 
    public void test1() throws Exception { 
     Map<String, String> exceptions = new HashMap<String, String>(); 
     String[] array = {"1","a","2","b","6"}; 
     for (int i=0; i< array.length ; i++) { 
      try { 
       int a = Integer.parseInt(array[i]); 
      } catch (Exception e) { 
       exceptions.put(array[i], e.getMessage()); 
      } 
     } 
     if(exceptions.size() > 0) { 
      System.out.println("Total Number of exception " + exceptions.size()); 
      for (Entry<String, String> entry : exceptions.entrySet()) { 
       System.out.println(entry.getKey() + " " + entry.getValue()); 
      } 
      throw new Exception(); 
     } 
    } 
    private int parse(String str) { 
     int a = Integer.parseInt(str); 
     return a; 
    } 
} 

您也可以使用裏面customException的。