我的应用程序会在后台线程中定期检查一个网络文件夹(UNC路径)是否有应用程序更新。它会读取文件的程序集版本,就像这样:
Try
newVers = System.Reflection.AssemblyName.GetAssemblyName("\\server\app.exe").Version
Catch ex As Exception
' ignore
End Try
这段代码经常被执行,我猜测在多个客户网站上总共执行了超过十万次而没有问题。
有时候,GetAssemblyName
会引发 FileNotFoundException
异常,例如当网络文件夹无法访问时(可能会发生,并需要处理)。该异常会被下面的 Catch
块捕获,一切都正常工作。
然而,在三个已报告的情况下,GetAssemblyName
调用引发了一个 SEHException
。奇怪的是,该异常并未被下面的 Catch
块捕获,但被我的全局未处理异常处理程序 (System.AppDomain.CurrentDomain.UnhandledException
) 捕获。结果,应用程序崩溃了。
以下是异常详细信息(不幸的是,异常的 ErrorCode
和 CanResume
字段未被我的错误处理例程记录):
Caught exception: System.Runtime.InteropServices.SEHException
Message: External component has thrown an exception.
Source: mscorlib
TargetSite: System.Reflection.AssemblyName nGetFileInformation(System.String)
StackTrace:
at System.Reflection.AssemblyName.nGetFileInformation(String s)
at System.Reflection.AssemblyName.GetAssemblyName(String assemblyFile)
at SyncThread.Run()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
为什么下面的Catch
块没有捕获到这个异常?
(也许这与此有关:这只发生在客户站点上,其中UNC路径指向的是不属于本地网络而是VPN上的远程服务器。)