1

我一直在使用条件编译作为一种允许我使用生产代码轻松调试(通过删除 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 语法(另外,这种方法意味着我无法在没有重大更改的情况下将其应用于现有代码)

有没有人找到解决这个问题的好方法,或者有人能想到我的版本的改进吗?

4

1 回答 1

2

我不确定你为什么需要这样做——我从未见过有人像这样调试异常。

您是否知道可以将 Visual Studio 配置为在引发异常时中断而无需不同的代码路径?

调试->异常->检查“抛出”

如果我正确理解了这个问题 - 那么这可以解决您在 VS 中调试的问题。

于 2012-04-23T09:59:23.630 回答