2010-09-03 94 views
3

我有兩個我想用於錯誤處理的靜態方法。其中一個傳遞異常對象,另一個僅在需要報告基於文本的消息(字符串errorMessage)的錯誤時使用。重載最佳實踐

這兩種方法中的代碼幾乎與消息如何構建併發送到日誌文件的例外情況相同。我如何重構這個,以便我不重複代碼?

public static void ReportError(Exception exceptionRaised, string reference, string customMessage, bool sendEmail) 
{ 
    // get filename 
    // check if logfile exists, blah, blah 
    // build up message from exception, reference & custom message using string builder 
    // save message 
    // email error (if set) 
} 

public static void ReportError(string errorMessage, string reference, bool sendEmail) 
{ 
    // get filename 
    // check if logfile exists, blah, blah 
    // build up message from errorMessage & reference string builder 
    // save message 
    // email error (if set) 
} 

謝謝。

回答

3

一個簡單的解決方案是將重複的代碼提取到它自己的方法,這樣的:

public static void ReportError(Exception exceptionRaised, string reference, string customMessage, bool sendEmail) 
{ 
    // build up message from exception, reference & custom message using string builder 
    ProcessError(Message, SendEmail) 
} 

public static void ReportError(string errorMessage, string reference, bool sendEmail) 
{ 
    // build up message from errorMessage & reference string builder 
    ProcessError(Message, SendEmail) 
} 

private static void ProcessError(string message, bool sendEmail) 
{ 
    // get filename 
    // check if logfile exists, blah, blah 
    // save message 
    // email error (if set) 
} 

這肯定不是最優雅的方式來做到這一點,但它是一個開始;-)

+0

我個人更喜歡這種工作方式,因此它也是我的答案。我不喜歡將'''''和'null'值傳遞給方法,即使它對開發用戶是隱藏的。所以+1。 – GenericTypeTea 2010-09-03 09:17:51

+0

感謝您的回覆。這看起來像我喜歡的方式,因爲我也不喜歡發送空值。我注意到了其他的註釋,並重新排列了參數的順序,並將字符串errorMessage重命名爲字符串customMessage - 這與其他方法更一致。 非常感謝 – StuffandBlah 2010-09-03 09:43:34

9

看到所有你做不同的第一種方法是建立一個自定義消息,改變你的第一種方法通過純文本錯誤信息的方法來通過自定義的異常,而不是:

public static void ReportError(Exception exceptionRaised, string reference, 
    string customMessage, bool sendEmail) 
{ 
    string errorMessage = BuildMessage(exceptionRaised, customMessage); 
    ReportError(errorMessage, reference, sendEmail); 
} 

免責聲明:不完全確定這是否可行。這取決於你如何建立錯誤信息。

編輯:

或者你可以添加第三個過載:

private static void ReportError(string completeException, bool sendEmail) 
{ 
    // Do what needs to be done. 
} 

然後你的方法可能只是雙方建立的異常信息,並通過該字符串和sendEmail布爾第三超載。

+1

我個人比接受的答案更喜歡這一個,因爲它生成了兩個變體如何相互關聯的更清晰的圖像。 – 2010-09-03 10:31:56

+0

想了一會兒,我也找到了解決方案,我的答案更好。 (正如我所說的,我的方法*'當然不是最優雅的方法,但它是一個開始'*)。你不僅從我做過的同一點開始,你走得更遠一點。 +1,我希望OP能夠接受你的答案! – Treb 2010-09-03 20:47:07

5

你可以用更少的參數調用帶有更多參數的過載,通過null或「」作爲自定義消息嗎?

public static void ReportError(string errorMessage, 
           string reference, 
           bool sendEmail) 
{ 
    ReportError(errorMessage, reference, null, sendEmail); 
} 

請注意,如果您使用的是C#4,則可以使用可選參數在不重載的情況下執行此操作。

0
void report(Exception e) 
{ 
    //convert exception to plain text 
    string text = e.ToString(); 
    //re-use the other overload 
    report(text); 
} 

void report(string text) 
{ 
    ...etc... 
} 

更復雜的版本:

delegate string GetString(); 

public void report(Exception e) 
{ 
    GetString getString = delegate() { return e.ToString(); } 
    report(getText); 
} 

public void report(string text) 
{ 
    GetString getString = delegate() { return text; } 
    report(getText); 
} 

void report(GetString getString) 
{ 
    ...etc... 
    string text = getString(); 
    ...etc... 
} 
1

當重載方法,請確保第一個參數總是相同的。否則會有點混亂。在你的情況下,作爲例外的最後一個參數。

public static void ReportError(string customMessage, string reference, bool sendEmail, Exception exceptionRaised) 

至於代碼重複。使這兩個方法調用第三個保護方法,它實際處理。 在調用第三個方法之前,異常方法可以格式化異常並將其添加到消息參數中。

+0

+1用於保持參數對齊。有時我忘記了一個類接口被人類而不是計算機消耗(即*讀取*)。值得記住的教訓... – Treb 2010-09-03 20:51:21

0

其他答案是好的,但我想我會添加一些東西,以避免我遇到過,這往往是一個維護的痛苦... ...

public void report(string text) 
{ 
    ... 
    report(text,defaultvalue); 
} 

public void report(string text, string email) 
{ 
    ... 
    report(text,email,null); 
} 

public void report(string text, string email, List<string> errors) 
{ 
    ... 
} 
... 
etc. 

這往往是很是煩人,當你有需要重構所有這些方法都只是因爲你想的方法之一更改參數。