【问题标题】:Conditional compilation for try catchtry catch 的条件编译
【发布时间】:2012-05-03 22:17:27
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嘿 - 它发生了 :) 自从 VS 首次问世以来,我一直在使用它,老实说,还有很多我从未调查过的选项!
    猜你喜欢
    • 1970-01-01
    • 2014-04-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2022-11-03
    • 2010-12-14
    • 2015-06-15
    • 2012-12-24
    相关资源
    最近更新 更多