Пример #1
0
        /// <summary>
        /// Walking through the exception handler chain to find the proper 
        /// exception handler. Also notify the observers who are keen on being 
        /// notified when an exception is happening. 
        /// </summary>
        /// <param name="context">Exception context</param>
        public void HandleFirstHandException(ExceptionContext context)
        {
            ExceptionHandler exceHandler = ExceptionTable.FindExceptionHandler(context);
            if (exceHandler != null)
            {
                TargetHandler = exceHandler;
            }
            Context = context;
            IsStackUnwinding = true;

            // Anybody wants to be notified before going to exception handler
            // or stack unwinding?
            foreach (IFirstHandExceptionObserver observer in Observers)
            {
                observer.Notify(context);
            }
        }
Пример #2
0
        /// <summary>
        /// Walk through chained exception registration instances to find out
        /// the corresponding exception handler. Returns null if cannot find
        /// the handler.
        /// </summary>
        /// <param name="context">Exception context</param>
        /// <returns></returns>
        public ExceptionHandler FindExceptionHandler(ExceptionContext context)
        {
            int regIndex = IndexOf(context.codeBlockId, context.functionScope, context.classScope);
            Validity.Assert(regIndex != ProtoCore.DSASM.Constants.kInvalidIndex);

            ExceptionRegistration registration = Registrations[regIndex];
            int pc = context.pc;
            while (true)
            {
                int handlerIndex;
                if (registration.HandleIt(pc, context.typeUID, out handlerIndex))
                {
                    Validity.Assert(handlerIndex != ProtoCore.DSASM.Constants.kInvalidIndex);
                    return registration.Handlers[handlerIndex];
                }
                else
                {
                    int parentIndex = registration.ParentIndex;
                    if (parentIndex == ProtoCore.DSASM.Constants.kInvalidIndex)
                    {
                        break;
                    }
                    else
                    {
                        pc = registration.LastPc;
                        registration = Registrations[parentIndex];
                    }
                }
            }
            return null;
        }