我一直在使用条件编译作为一种允许我使用生产代码轻松调试(通过删除 try catch 块)的方法。我这样做的原因是因为 Visual Studio 将(显然)将抛出异常的位置显示为最顶层处理程序的 catch 块。不幸的是,在您删除处理程序之前,这会阻止调试或至少定位错误的确切位置。
这是我当前方法的一个示例
private void btnConnect_Click(object sender, EventArgs e)
{
#if DEBUG
DoSomething();
#else
try
{
DoSomething();
}
catch (Exception ex)
{
Logger.Log(ex);
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
CleanUp();
}
#endif
}
这种方法会导致大量的代码重复,我希望能找到一种替代方法。
我考虑了一种方法,我将使用 lambdas 创建自定义 try catch 块处理程序,该处理程序在内部使用条件编译来处理或重新抛出这样的异常。
void TryCatchFinally(Action tryBlock, Action<Exception> catchBlock, Action finallyBlock)
{
#if DEBUG
tryBlock.Invoke();
finallyBlock.Invoke();
#else
try
{
tryBlock.Invoke();
}
catch (Exception ex)
{
catchBlock.Invoke(ex);
}
finally
{
finallyBlock.Invoke();
}
#endif
}
但我更愿意保留标准的 try catch 语法(另外,这种方法意味着我无法在没有重大更改的情况下将其应用于现有代码)
有没有人找到解决这个问题的好方法,或者有人能想到我的版本的改进吗?