我有两个静态方法,我想用它来处理错误。其中一个传递异常对象,另一个只是在需要报告错误时使用,该错误是基于文本的消息(字符串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)
}
感谢。
答案 0 :(得分: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
boolean传递给第三个重载。
答案 1 :(得分:5)
您是否可以使用较少的参数调用具有更多参数的重载,将null
或“”作为自定义消息传递?
public static void ReportError(string errorMessage,
string reference,
bool sendEmail)
{
ReportError(errorMessage, reference, null, sendEmail);
}
请注意,如果您使用的是C#4,则可以使用可选参数在不重载的情况下执行此操作。
答案 2 :(得分: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)
}
这当然不是最优雅的方式,但它是一个开始; - )
答案 3 :(得分:1)
重载方法时,请确保第一个参数始终相同。否则,这有点令人困惑。在您的情况下,将异常作为最后一个参数。
public static void ReportError(string customMessage, string reference, bool sendEmail, Exception exceptionRaised)
至于代码重复。使两个方法调用第三个受保护的方法来执行实际处理。 异常方法可以格式化异常并在调用第三个方法之前将其添加到message参数。
答案 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...
}
答案 5 :(得分: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.
当您必须重构所有这些方法时,这往往会非常烦人,因为您想要在其中一个方法中更改参数。