2006年12月26日 星期二

Loging 實務:log4j 設定檔範例


#設定 Logger(s),格式 logger_name = message_level, appender1, appender2, ...
log4j.rootCategory=error, stdout

#以下是給fileftp.java使用的專屬Category
log4j.category.doftp.name=info, X
#以下設定false時,訊息不會往rootCategory送,只會在doftp.name的自訂Categoey中
log4j.additivity.doftp.name=false

#設定 Appenders
#### First appender writes to console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

# Pattern to output the caller's file name and line number.
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] (%F:%L) - %m%n

### 設定doftp.name是RollingFile的方式
log4j.appender.X=org.apache.log4j.RollingFileAppender
log4j.appender.X.File=doftp.log
log4j.appender.X.MaxFileSize=300KB
log4j.appender.X.MaxBackupIndex=2
log4j.appender.X.layout=org.apache.log4j.PatternLayout
log4j.appender.X.layout.ConversionPattern=%5p %d{yyyy-MM-dd HH:mm:ss} %m%n

2006年12月25日 星期一

測試預期的 Exception 行為

當某個方法我們預期會丟出 Exception 時,
可利用 fail 這個述詞來測試。
如以下的 JUnit 語法:

public void testGetUserException() {
User u = null;
try {
u = UserFetcher.getUser("ThisUserIdDoesNotExist");
fail("Should have gotten NoSuchUserException - used a bad user ID");
} catch (NoSuchUserException expected) {
; // Expected - intentional
}
}

2006年11月16日 星期四

JDBC 實務:使用 JDBC 時,一定要放在 try 區塊中,並於 finally 區塊釋放 Connection

在 try/catch/finally 語法中,若有定義 finally 區塊,則執行 try 區塊後,一定會執行 finally 區塊的程式碼。
所以若程式有使用 JDBC 時,一定要包在 try 區塊中,並在 finally 中關閉 connection 釋放資源,才不會耗盡資源。
一般實務作法如下例:


Connection con=null;
try{
con=new Connection();
...
...
...
}finally{
try{
con.close();
}catch(Throwable e) {
String errmsg="close connection failed! errmsg is "+e.getMessage();
log.error(errmsg);
}
}

Java 實務:發生例外事件時,log 所有的錯誤訊息

系統發生無法處理的例外時,若只顯現「發生系統錯誤,請連絡資訊室!」,但完全沒有 log 錯誤訊息,對除錯是沒有幫助的,尤其是網頁程式,若沒有作 log,則程式人員是無法掌握例外當下系統的狀態。
因此系統應導入 log 機制 Ex.log4j,來幫助我們 trace 產生例外的程式。建議所有的程式,全部應放鄉 try/catch(throwable) 區塊,除了顯現「發生系統錯誤,請連絡資訊室!」外,並將所有例外訊息傳給 log 以利除錯。
建議在程式加入以下源碼:

try {
;
}catch(Throwable e){
String errmsg = "系統例外:"+e.getMessage();
log.error(errmsg);
throw new RuntimeException(errmsg, e);
}

2006年9月5日 星期二

ANT 的 depnedent 工具

ANT 對 file operation 有一項很不錯的功能,
若 file 的 directory 不存在,
就自動建立,若 file uptodate? 則不動作。

copy

字串處理的程式片段集合

以下是一堆字串處理的程式片段集合

#日期相關的
*2008/01/01 -> 20080101
Java:
String.replaceAll("/", "');

2006年8月4日 星期五

T:描述結構性資料

抽象化的第一件事,是能用簡單的名字描述一串結構,
較佳的結構至少是類 xml 的階層結構。
階層結構由 "{}"來區分,
而 sequence 結構由 "," 及出現的前後區分。
一個 order 有很多 entry 可這樣描述
order ={
light={amt=2},
bulb={amt=2}
}

取出 order 第一個物件就是
order.light.amt==2
用"." 點來區分物件。