【问题标题】:Preserving stack trace when rethrowing exceptions in Silverlight在 Silverlight 中重新引发异常时保留堆栈跟踪
【发布时间】:2010-11-29 23:10:47
【问题描述】:

我需要重新抛出一个被捕获并存储在其他地方的异常而不丢失有关何时首次捕获/存储异常的堆栈跟踪信息。我的代码如下所示:

    public void Test()
    {
        int someParameter = 12;
        ExecuteSomeAsyncMethod(someParameter, CallbackMethod);   
    }

    public void CallbackMethod(object result, Exception error)
    {
        //Check for exceptions that were previously caught and passed to us
        if(error != null)
            //Throwing like this will lose the stack trace already in Exception
            //We'd like to be able to rethrow it without overwriting the stack trace
            throw error;

        //Success case: Process 'result'...etc...
    }

我已经看到使用反射(例如 herehere)或使用序列化(例如 here)的解决方案,但在 Silverlight 中这些都不适合我(私有反射不是允许并且序列化方法中使用的类/方法在 Silverlight 中不存在)。

有什么方法可以保留 Silverlight 中的堆栈跟踪吗?

【问题讨论】:

    标签: c# .net silverlight exception


    【解决方案1】:

    抛出一个新的异常,异常为内部异常:

    throw new ApplcationException("Error message", error);
    

    内部异常将保留它的堆栈跟踪。

    【讨论】:

    • 这是我现在唯一的选择。不幸的是,这可能/将干扰现有代码,如“catch(SpecificExceptionClass)”,或者以其他方式检查异常类型。理想情况下,我希望尽可能避免包装 Exception,因为我不希望消费者必须开始检查 InnerExceptions 中的“真实”异常。
    【解决方案2】:

    你可以使用

    catch(Exeption)
    {
       throw;
    }
    

    catch(Exception e)
    {
       throw new Exception(e);
    }
    

    两者都将保留堆栈跟踪。在您的示例中,第一个解决方案似乎是不可能的,但第二个应该可以工作。

    在您的情况下,您当然会抛出参数 error 而不是 e

    【讨论】:

    • 如果您想提及所有在此处不起作用的可能解决方案,您忘记了最简单的解决方案:根本不捕获异常。 ;)
    • @Guffa,是的......但是当异常发生时,他将无法执行他似乎想要执行的任何逻辑。我提到两者的唯一原因是,对他的代码进行简单的重写可能会使第一个更有吸引力。但是你是有道理的,没有捕捉到异常,会阻止它被捕捉到:)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2013-01-17
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    相关资源
    最近更新 更多