Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 调试时是否忽略特定位置的异常?_C#_Debugging_Exception - Fatal编程技术网

C# 调试时是否忽略特定位置的异常?

C# 调试时是否忽略特定位置的异常?,c#,debugging,exception,C#,Debugging,Exception,我们的应用程序正在移动启动期间运行所需的一些文件 应用程序会注意(关闭时)正确停止使用此文件的每个进程 但是,如果应用程序崩溃/或者您只是在VS on Debugging中点击了“stop”,则某些可执行文件可能仍在运行 因此,如果快速重新启动应用程序,可能会发生复制尝试失败的情况,因为文件仍在使用中 对于这种情况,我们只需忽略失败的复制尝试,或者更准确地说,忽略失败的删除尝试,这应该确保最新版本可用: foreach(String entry in contents) { if (Sy

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

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

但是,如果应用程序崩溃/或者您只是在VS on Debugging中点击了“stop”,则某些可执行文件可能仍在运行

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

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

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.
        }
    }
}

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

就目前而言,我们使用了以下“解决方法”:检查,如果文件在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
        }
    }
}
我们只是想避免在这一行代码中忽略异常时出现“调试器中断”

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
        }
    }
}
foreach(目录中的字符串条目)
{
if(System.IO.File.Exists(条目))
{
试一试{
#如果(调试)
FileInfo fi=新的FileInfo(条目);
if(fi.LastAccessTime

这不是一个解决方案,它是一个变通方法,可以将这行代码中的调试器中断减少99%,以防您在VisualStudio中“停止”调试

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