相关疑难解决方法(0)

如何重新抛出InnerException而不会丢失C#中的堆栈跟踪?

我通过反射调用一种可能导致异常的方法.如何在没有包装器反射的情况下将异常传递给调用者?
我正在重新抛出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 c# exception

290
推荐指数
9
解决办法
7万
查看次数

为什么我总是要做我的例外[serializable]?(.净)

参考什么是使自定义.NET异常可序列化的正确方法?
并且所有.NET异常都可序列化吗?...

为什么我的例外可以序列化?
如果由第三方库定义的自定义异常不可序列化,有人说"它可以被视为一个bug".为什么?

为什么异常在这方面与其他类别不同?

.net exception serializable

39
推荐指数
1
解决办法
4816
查看次数

保留动态调用方法的异常

我想动态调用一个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)

c# reflection exception

10
推荐指数
1
解决办法
6324
查看次数

如何保护应用程序池免受会话序列化异常的影响?

我们正在为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)

asp.net session serialization restart httpmodule

7
推荐指数
1
解决办法
1944
查看次数