我通过反射调用一种可能导致异常的方法.如何在没有包装器反射的情况下将异常传递给调用者?
我正在重新抛出InnerException,但这会破坏堆栈跟踪.
示例代码:
public void test1()
{
// Throw an exception for testing purposes
throw new ArgumentException("test1");
}
void test2()
{
try
{
MethodInfo mi = typeof(Program).GetMethod("test1");
mi.Invoke(this, null);
}
catch (TargetInvocationException tiex)
{
// Throw the new exception
throw tiex.InnerException;
}
}
Run Code Online (Sandbox Code Playgroud) 参考什么是使自定义.NET异常可序列化的正确方法?
并且所有.NET异常都可序列化吗?...
为什么我的例外可以序列化?
如果由第三方库定义的自定义异常不可序列化,有人说"它可以被视为一个bug".为什么?
为什么异常在这方面与其他类别不同?
我想动态调用一个MethodInfo对象,并且从它内部抛出的任何异常向外传递,就像它被正常调用一样.
我看来有两种选择.它们概述如下.
选项1保持抛出的异常的类型MyStaticFunction,但是StackTrace因为它而被破坏throw.
选项2维护StackTrace异常,但异常的类型始终如此TargetInvocationException.我可以提取InnerException它的类型,但这意味着我不能写这个例子:
try { DoDynamicCall(); }
catch (MySpecialException e) { /* special handling */ }
Run Code Online (Sandbox Code Playgroud)
选项1:
void DoDynamicCall()
{
MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
try
{
method.Invoke(null, new object[] { 5 });
}
catch (TargetInvocationException e)
{
throw e.InnerException;
}
}
Run Code Online (Sandbox Code Playgroud)
选项2:
void DoDynamicCall()
{
MethodInfo method = /*referencing MyClass method void MyStaticFunction(int x)*/;
method.Invoke(null, new …Run Code Online (Sandbox Code Playgroud) 我们正在为ASP.NET应用程序使用进程外会话提供程序(ScaleOut),我们注意到当一个没有正确设置反序列化的对象无意中进入会话时,它最终会导致整个终止的过程.
重现和处理这种情况是它变得更有趣的地方.
在AnyStaObjectsInSessionState中引发了终止进程的异常,其实现非常简单:
internal static bool AnyStaObjectsInSessionState(HttpSessionState session)
{
if (session != null)
{
int count = session.Count;
for (int i = 0; i < count; i++)
{
object obj2 = session[i];
if (((obj2 != null) && (obj2.GetType().FullName == "System.__ComObject"))
&& (UnsafeNativeMethods.AspCompatIsApartmentComponent(obj2) != 0))
{
return true;
}
}
}
return false;
}
Run Code Online (Sandbox Code Playgroud)
这是堆栈跟踪,显示了异常如何终止进程:
An unhandled exception occurred and the process was terminated.
Application ID: /LM/W3SVC/1/ROOT
Process ID: 4208
Exception: System.Runtime.Serialization.SerializationException
Message: …Run Code Online (Sandbox Code Playgroud) exception ×3
.net ×2
c# ×2
asp.net ×1
httpmodule ×1
reflection ×1
restart ×1
serializable ×1
session ×1