.net - .NET System.Reflection.TargetInvocationException 未被捕获

  显示原文与译文双语对照的内容
140 0

解决方案后添加了英镑注释:反射调用的方法中引发了 AccessViolationException 。这就是TargetInvocationException无法被捕获的原因。

注意:这超出了IDE的范围。所引用的问题不相同。

磅;DR博士

  • 无法获取堆栈跟踪
  • 无法获得内部异常
  • 无法使用调试器( 第三方库的复制保护方案妨碍使用)
  • 对代码的任何更改都防止发生异常- 意味着我不能添加日志记录,找出异常发生的位置。

如何获取异常,或者获取需要的信息?

长描述:

在反射调用的方法中发生异常时出现问题。异常本身实际上发生在调用方法中,但是由于反射被反射调用,真正的异常被包装在一个方法中。System.Reflection.TargetInvocationException没有问题,只需捕获它并获取内部异常- 除了System.Reflection.TargetInvocationException我的程序崩溃了,我得到了一个转储和 Windows 事件日志中的一个条目。

Windows 事件日志不包含内部异常,也不包含转储。不能将调试器附加到程序,因为外部库( 那是到达反射呼叫所需要的) 不会运行- 复制保护,不知道。如果我将 try/catch 放入有缺陷的方法中,则不会发生异常- 这是错误的。原因是不固定的,只是不会再发生。如果我把日志记录到有缺陷的方法中,同样的效果也会发生- 异常不会再发生。

我不能使用日志记录,不能使用调试器,在一个地方可以以捕获异常并记录异常。

我正在使用 Visual Studio 2010和 dotnet 4.0.

让程序更清楚:当程序在之外运行时,try/catch 无法运行,因为程序不能在调试器中运行,因为程序不能到达异常发生的地方。这不在内部。

消除反射并不是一个选项( 我已经经尝试了一个例子,而异常将会消失) 。

被调用的方法做了很多事情,但是将它分解成较小的方法并没有帮助- 异常只是消失了。

异常不一直发生,只有当我做一定的步骤时,当它发生时,它总是第二次通过整个序列。

在我使用的序列中,方法几乎同时被两个线程调用。由于生成报告和打印文档可能需要一些时间,所以在后台的线程上执行这些操作,以便用户能够继续工作。

我怀疑这些线程在每一个脚趾上都是步行的( 大量的文件和数据库操作),但是不知道真正发生了什么。

下面的代码显示了反射调用的简化版本。

任何人都有关于可能导致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
时间:原作者:0个回答

144 5

找到了我无法捕获该异常的原因:

如果不采取特殊步骤( 如何处理 AccessViolationException ),实际的异常是 AccessViolationException,它不能捕获 dotnet 。)

如果 AccessViolationException thrown方法调用了 method,那么只有TargetInvocationException被记录在 Windows 事件日志中,并且只有在转储中有可用的TargetInvocationException 。

一旦我获得了真正的异常,我发现它是从导致AccessViolation的非gui线程调用 Application.DoEvents()的。当调用 DoEvents() 线程( 使用 Application.DoEvents() ) 时,会引起足够的乐趣,更不用说从后台线程调用。

一旦解决了这个问题,我发现第三方库( 有拷贝保护的那个) 不喜欢同时在单独的实例中调用。修正是在正确位置上的synclock问题。

所有这些乐趣的代码一次都在gui线程中,最初是在,的日期回来的。代码已经经被转换成一个智能的后台线程并行运行,没有一个开发人员完全概述过程。

原作者:
129 2

我不确定我可以以复制你的问题,但这是我们得到的,它只是工作正常。

 Try
 'YOUR CODE'
 Catch ex As Exception
 'This is where we grab it from... It needs to be in this block to work...
 System.Reflection.MethodInfo.GetCurrentMethod.ToString
 End Try

让我知道你是怎么工作的?

原作者:
...