在我们的WinForm应用程序中,我们的WinForm控件的事件处理程序中经常有以下try / catch块:
private void button_Click(object sender, EventArgs e)
{
try
{
<code goes here>
}
catch (Exception exception)
{
Logger.LogError(exception);
}
}
最近我们建议实施以下内容:
private void button_Click(object sender, EventArgs e) =>
this.TryCatchLogError(() =>
{
{
<code goes here>;
}
});
哪里
public static class Logger
{
public static void LogError(Exception e)
{
<logs the exception>
}
public static void TryCatchLogError<T>(this T item, Action action)
{
try
{
action();
}
catch (Exception ex)
{
LogError(ex);
}
}
}
}
这种方法有什么缺点吗?例如,性能问题,线程安全等......
答案 0 :(得分:0)
这些功能相同,性能差异微不足道。尽管如此,第一个似乎更具可读性和灵活性。可读的是,你在做什么很清楚。灵活的是,您可以在catch块中添加额外的清理,如果需要那些可能需要执行其他操作的少数方法。第二种方法更加一致。我赞成第一个 - 但这是一个品味问题。
答案 1 :(得分:0)
使用匿名方法可以更难理解堆栈跟踪。
使用匿名方法:
A first chance exception of type 'System.Exception' occurred in WinFormTest.exe
at WinFormTest.MainForm.<button1_Click>b__0() in c:\users\jayv\Documents\Tools\TestApplications\WinFormTest\MainForm.cs:line 19
at WinFormTest.Logger.TryCatchLogError[T](T item, Action action) in \\smbcgroup.com\dfs\users\jvarsani\Documents\Tools\TestApplications\WinFormTest\MainForm.cs:line 49
没有匿名方法:
A first chance exception of type 'System.Exception' occurred in WinFormTest.exe
at WinFormTest.MainForm.button2_Click(Object sender, EventArgs e) in c:\users\jayv\Documents\Tools\TestApplications\WinFormTest\MainForm.cs:line 28
匿名方法包括.<button1_Click>b__0()
即使有经验的人也可能不得不停下来思考一秒钟。除此之外,行号,方法名称和文件的所有重要细节都在那里。
话虽如此,我们在显示进度对话框或将光标从默认更改为忙时使用匿名方法样式