代码之家  ›  专栏  ›  技术社区  ›  dognose

调试时忽略某个位置的异常?

  •  2
  • dognose  · 技术社区  · 7 年前

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

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

    但是,如果应用程序崩溃/或者您只是在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) -避免在这一行代码中捕获异常的指令?

    比如:

    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.
            }
        }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   dognose    7 年前

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

    目前,我们采用了以下“变通办法”: 检查一下,如果文件在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
            }
        }
    }
    

    推荐文章