2014-01-08 15 views
2

我們目前正在開發一個內部使用的框架。我們現在處於想要使用標準化異常ID和消息的地步。開發人員只需提供一個ID和一條默認消息,框架將查找相關消息(如果可能)或使用默認消息(如果消息無法檢索)。 第一個想法是編寫一個異常工廠,它強制開發人員提供錯誤ID,然後在工廠方法中查找消息。這種方法的問題是,在棧跟蹤中添加了一個額外的框架(創建異常的工廠方法)。那不太好。幾乎所有試圖隱藏創作的解決方案都存在這個問題。 第二個想法是將消息查找和我們的異常類耦合起來,然後編寫一個抽象異常類,它在構造函數中接收錯誤ID並處理消息查找。但那也不是很好,因爲它缺乏鬆耦合。 第三個想法是讓開發人員每次都寫郵件的查找..也不錯..如何在Java中編寫異常工廠

你有什麼想法嗎?

P.S.我認爲是我第一次需要在Java中宏..

了不同的方法代碼:

1.

throw createException(new ErrorId("123"), TechnicalException.class, "defaultmsg"); //uses reflection, also not very nice but works 

throw createTechnicalException(new ErrorId("123", "defaultmsg"); //write a method for every type of exception 

2.

public TechnicalException(ErrorId errorId, String defaultmsg) { 
    super(defaultmsg); 
    //get msg here and set on a new field cause detailMessage is not accessible. Also overwrite toString(); 
} 

throw new TechnicalException(new ErrorId("123"), "defaultmsg"); 

3.

ErrorId errorId = new ErrorId("123"); 
String msg = someProvider.getMessage(errorId); 
throw new TechnicalException(errorId, msg); 
+3

如何創建**錯誤消息**工廠而不是**異常**工廠? –

回答

0

可以編輯堆棧跟蹤,刪除不需要的元素。如果所有異常的構造函數都需要相同的數據,請使用單個createException,否則使用createCustomException方法。

這將刪除不必要的堆棧跟蹤元素。

public static <T extends Throwable> T adjustStackTrace(T ex, int removedElements) { 
    //use an explicit constraint for removedElements 
    if (removedElements < 1) { 
     throw new IllegalArgumentException("removedElements may not be less than 1"); 
    } 
    final StackTraceElement[] stack = ex.getStackTrace(); 
    //or an implicit constraint 
    removedElements = Math.max(removedElements, stack.length); 

    final StackTraceElement[] newStack = new StackTraceElement[stack.length - removedElements]; 
    System.arraycopy(stack, removedElements, newStack, 0, stack.length - removedElements); 
    ex.setStackTrace(newStack); 
    return ex; 
} 

自定義excepton的方法:

public static TechnicalException createTechnicalException(Object... someExceptionSpecificData) { 
    StringBuilder sb = new StringBuilder(); 
    sb.append("...").append("..."); //create a message 

    //process the someExceptionSpecificData 
    Object[] someNewData = someExceptionSpecificData; 

    TechnicalException ex = new TechnicalException(sb.toString(), someNewData); 

    ex = adjustStackTrace(ex, 1 /*remove StackTraceElement, related to this method call*/); 
    return ex; 
} 

或者你可以使用一個單一的方法,並通過所需的異常類:

public Exception createException(Class<?> exClass, Object... someExceptionSpecificData) {...} 

使用示例:

public void useExceptionFactory() { 
    throw ExceptionFactory.createTechnicalException(); 
} 

public void adjustEvenMore() { 
    //adjust even more to hide the implementation of your library 
    throw ExceptionFactory.adjustStackTrace(ExceptionFactory.createTechnicalException(),1); 
} 

這個例子是基於網絡的。從OVal框架sf.oval.internal.util.Assert,請參見http://oval.sourceforge.net/

相關問題