try catch的条件编译

时间:2012-04-23 09:50:17

标签: .net exception-handling lambda try-catch conditional-compilation

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

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

1 个答案:

答案 0 :(得分:2)

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

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

Debug-&gt; Exceptions-&gt;选中“Thrown”

如果我已正确理解了这个问题 - 那么这就解决了你在VS中进行调试的问题。