解决方案后添加的说明:反射调用的方法中出现了AccessViolationException异常,这是TargetInvocationException无法被捕获的原因。
注意:这是在IDE之外。所引用的问题与此不同。
简短概述:
- 获取不到堆栈跟踪
- 无法获取内部异常
- 不能使用调试器(第三方库的版权保护机制会干扰)
- 对代码进行任何更改都会阻止异常的发生 - 这意味着我无法添加记录以查找异常发生的位置
如何捕获异常或以其他方式获取所需信息?
详细描述:
我有一个问题,涉及到通过反射调用的方法中发生的异常。实际上,异常是在被调用的方法中发生的,但由于该方法是通过反射调用的,因此真正的异常被包装在了“System.Reflection.TargetInvocationException”中。没有问题,只需捕获它并获取内部异常 - 但“System.Reflection.TargetInvocationException”没有被捕获。我的程序崩溃了,并且我得到了转储以及Windows事件日志中的条目。Windows事件日志不包含内部异常,转储也不包含。我无法将调试器附加到程序中,因为这样会导致一个外部库(需要访问反射调用)无法运行 - 这是版权保护,你知道的。如果我在有问题的方法中放置try/catch,则异常不会发生 - 这很糟糕。原因没有解决,只是不再发生了。如果我在有问题的方法中放置记录日志,则同样会发生这种情况 - 异常不会再次发生。
我无法使用日志记录,无法使用调试器,在唯一可以捕获异常并记录其的地方,异常却没有被捕获。我正在使用Visual Studio 2010和dotnet 4.0。
让我来解释一下:当程序在Visual Studio之外运行时,try/catch就无法起作用,而我也不能在调试器中运行它,因为程序无法到达异常发生的点。这不是在IDE中。
消除反射不是一个选择(我已经尝试了只针对一个情况,异常就消失了)。
被调用的方法做了很多事情,但将其分解成小方法并没有帮助——异常仍然存在。
异常并不总是发生,只有在我执行某个特定步骤时才会发生——并且当它发生时,总是在整个序列第二次执行时发生。
在我使用的序列中,该方法几乎同时由两个线程调用——输入了一堆特定数据,导致报告和另一个文档的副本在两台独立的打印机上打印——每台打印机各有一个报告和文档。由于生成报告和打印文档可能需要一些时间,因此它们在后台的线程中完成,以便用户可以继续工作。
我怀疑这些线程互相干扰(进行了大量文件和数据库操作),但如果不知道实际发生了什么,我就无法修复它。
下面的代码显示了通过反射调用的简化版本。
有人有关于导致 System.Reflection.TargetInvocationException
无法被捕获的建议吗?或者有没有其他捕获内部异常的替代方法?
Try
Dim methode As System.Reflection.MethodInfo
methode = GetType(AParticularClass).GetMethod("OneOfManyMethods", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static)
Dim resultobject As Object = methode.Invoke(Nothing, Reflection.BindingFlags.InvokeMethod Or Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Static, Nothing, New Object() {SomeBooleanVariable, SomeStringVariable}, Nothing)
result = DirectCast(resultobject, DataSet)
Catch ex As Exception
'Log the error here.
End Try
Catch
块内部使用System.Reflection.MethodInfo.GetCurrentMethod.ToString
,而不是在外部使用它,它完全正常运行...你为什么要“调用”,它根本没有做任何事情... - Trevor