【发布时间】: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 以来不再工作 - 它现在也会在调用者位置抛出/中断。