【问题标题】:Ignore Exception at a certain Location while debugging?调试时忽略某个位置的异常?
【发布时间】:2019-06-13 01:19:05
【问题描述】:

我们的应用程序正在移动一些在启动期间运行所需的文件。

应用程序会注意(在关闭时)正确停止使用此文件的每个进程。

但是,如果应用程序崩溃/或者您只是在 VS 的调试中点击“停止” - 一些可执行文件可能仍在运行。

因此,如果您快速重新启动应用程序,可能会发生复制尝试失败的情况,因为该文件仍在使用中。

对于这种情况,我们只是忽略失败的复制尝试 - 或者更准确地说:失败的删除尝试应该确保最新版本可用:

foreach(String entry in contents)
{
    if (System.IO.File.Exists(entry))
    {
        try
        {
            System.IO.File.Delete(entry);
        }catch (Exception e)
        {
            //ignore during this startup.
        }
    }
}

现在,这工作得很好,因为有一个版本的文件可供使用,而生产版本只是忽略了异常。

烦人的问题是,调试器每次“中断”,都会发生此错误。

  • 我们一般不希望在调试时“忽略”任何System.IO.IOException
  • 我们尝试使用[System.Diagnostics.DebuggerStepThrough()] 注释问题中的方法,这有效,但会导致在调用者位置捕获异常。

那么,有没有办法忽略在某行代码中引发的“某些”异常,即使启用了该类型的一般“中断”?

一些#if (DEBUG)-Directives 将避免在此特定代码行捕获异常?

类似:

foreach(String entry in contents)
{
    if (System.IO.File.Exists(entry))
    {
        try
        {
#if (DEBUG:NoThrow)
            System.IO.File.Delete(entry);
#endif
        }catch (Exception e)
        {
            //ignore during this startup.
        }
    }
}

【问题讨论】:

  • 与其说是源码级别的解决方案,不如配置MSVS呢?这可能会有所帮助:docs.microsoft.com/en-us/visualstudio/debugger/…。另外:您可以考虑将自己的异常子类化,并有选择地重新抛出您的“自定义异常类型”(包括“真实”异常作为“嵌套异常”)
  • @paulsm4 MSVS 只显示选项“继续未处理”-我们需要“继续处理”-此外,仅在 IDE 中执行的配置对于更大的团队来说有些不方便-基于代码-一旦提交,调试器的说明将为每个人解决问题。
  • ps.:在这种情况下,我们可以使用更多的 IO-Operations 来完全避免异常 - 但例如每次都会抛出“ThreadAbortException” - 我们可能只对它感兴趣对于某些特定线程(调试时)...
  • Sidenode,因为我已经尝试了很多:[DebuggerNonUserCode] 自 VS 2015 以来不再工作 - 它现在也会在调用者位置抛出/中断。

标签: c# debugging exception


【解决方案1】:

我仍然对答案感兴趣,因为它有“很多”用例。

暂时,我们使用了以下“解决方法”:检查文件是否在 3 分钟内被访问 - 然后不要尝试删除它。 (对于调试模式!)

请记住,实际问题仅与“调试器”有关,而不是生产环境,在生产环境中,可以轻松捕获(并忽略)某行代码的异常。

如果在这行代码中可以保存地忽略异常,我们只是想避免“调试器中断”启动。

foreach (String entry in contents)
{
    if (System.IO.File.Exists(entry))
    {
        try {
#if (DEBUG)
            FileInfo fi = new FileInfo(entry);
            if (fi.LastAccessTime < DateTime.Now.AddMinutes(-3))
            {
#endif
                System.IO.File.Delete(entry);
#if (DEBUG)
            }
#endif
        }
        catch (Exception e)
        {
            //ignore
        }
    }
}

这不是解决方案,而是一种解决方法,可将这行代码处的 Debugger-Breaks 减少约 99%,以防您只是在 Visual Studio 中“停止”调试!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2011-05-28
    • 1970-01-01
    • 2017-02-22
    相关资源
    最近更新 更多