ExceptionReporting.Report(ex) Missing Local Var/Stack Trace

memeDevelopermemeDeveloper Posts: 21
edited July 12, 2012 8:22AM in SmartAssembly
Hi,

I am trying to report exceptions to smart assembly. I have a method in my application which is called whenever an exception occur. I want to add error reporting in that method. I have used this ExceptionReporting.Report(ex) in my method. Now, whenever I want to report some exception or any other exception is thrown that method gets called and it has that line of code. However, in the reports , the local variables and the stack trace are missing. In the wiki page of the SDK this is mentioned at the end of the page in the Misc section regarding my situation:

"If you want to manually send an exception to SmartAssembly's UnhandledExceptionHandler, you may use the method:

SmartAssembly.ReportException.ExceptionReporting.Report(System.Exception exception)

Note that the local variables and the stack trace are missing for the method which called Report. A workaround is to wrap the whole method up in a delegate or empty method."

Can someone show me an example for this workaround ?

Comments

  • Brian DonahueBrian Donahue Posts: 6,590 Bronze 1
    Hello,

    The first method is pretty self-explanatory. Create a new method and call the original method from it. If you are building a DLL, you may want to rename the methods so the entry point names are preserved.
    DoSomething()
    {
         OriginalDoSomething();
    }
    OriginalDoSomething()
    {
        try {
           Something();
              }
        catch (Exception exc)
              {
                  ExceptionReporting.Report(exc);
               }
    }
    
    EDIT: The above solution has been proven not to work.
    Solution number 2 involves creating a delegate:
    using System;
    using SmartAssembly.ReportException;
    
    namespace delegateexample
    {
        class Program
        {
            static void Main(string[] args)
            {
                ErrorHandling.DoWithErrorHandling(delegate
                {
                    OriginalDoSomething();
                }
                );
                Console.ReadLine();
            }
    
            private static void OriginalDoSomething()
            {
                /* your original code */
            }
        }
        // Delegate needs to be typed for DoWithErrorHandling...
        public delegate void DoSomethingDelegate();
        /// <summary>
        /// This class will invoke the code specified in the delegate and report exceptions to SA
        /// </summary>
        
        class ErrorHandling
            {
                public static void DoWithErrorHandling(DoSomethingDelegate toDo)
                {
                    try
                    {
                        toDo();
                    }
                    catch (Exception e)
                    {
                        ExceptionReporting.Report(e);
                    }
                }
            }
    }
    
    In this way, you create a new class to invoke the code and trap any errors. You can wrap any code for which you want to report exceptions into the DoWithErrorHandling method.
Sign In or Register to comment.