SEHException nie został złapany przez Try / Catch
W wątku w tle moja aplikacja regularnie sprawdza folder sieciowy (ścieżka UNC) w celu aktualizacji aplikacji. Odczytuje wersję zespołu pliku, tak jak poniżej:
Try
newVers = System.Reflection.AssemblyName.GetAssemblyName("\\server\app.exe").Version
Catch ex As Exception
' ignore
End Try
Fragment ten jest wykonywany dość często, w sumie chyba ponad 100 000 razy w wielu witrynach klientów bez problemu.
Czasami,GetAssemblyName
podnosiFileNotFoundException
, na przykład w przypadku, gdy folder sieciowy nie jest osiągalny (co może się zdarzyć i należy się nim zająć). Ten wyjątek został złapany przezCatch
blok poniżej, a wszystko działa dobrze.
W trzech zgłoszonych przypadkach jednakGetAssemblyName
wezwanie podniosłoSEHException
. Dziwne jest to, że ten wyjątek nie został złapany przezCatch
blok poniżej, ale przez mój globalny nieobsługiwany program obsługi wyjątków (System.AppDomain.CurrentDomain.UnhandledException
). W rezultacie aplikacja ulega awarii.
Oto szczegóły wyjątku (niestetyErrorCode
iCanResume
pola wyjątku nie są rejestrowane przez moją procedurę obsługi błędów):
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()
Dlaczego wyjątek nie został złapany przezCatch
blok tuż poniżej?
(Być może jest to istotne: zdarzyło się to tylko w witrynach klientów, gdzie ścieżka UNC wskazywała na serwer, który nie był częścią sieci lokalnej, ale na serwer zdalny na VPN).