/// <summary> /// Raises an exception, throwing 'ex' as an IodineException object /// </summary> /// <param name="ex">Exception to raise.</param> public void RaiseException(IodineObject ex) { if (traceCallback != null) { traceCallback(TraceType.Exception, this, Top, currentLocation); } IodineExceptionHandler handler = PopCurrentExceptionHandler(); if (handler == null) // No exception handler /* * The program has gone haywire and we ARE going to crash, however * we must attempt to properly dispose any objects created inside * Iodine's with statement */ { StackFrame top = Top; while (top != null) { while (top.DisposableObjects.Count > 0) { IodineObject obj = top.DisposableObjects.Pop(); try { obj.Exit(this); // Call __exit__ } catch (UnhandledIodineExceptionException) { // Ignore this, we will throw one when we're done anyway } } top = top.Parent; } throw new UnhandledIodineExceptionException(Top, ex); } ex.SetAttribute("stacktrace", new IodineString(GetStackTrace())); UnwindStack(frameCount - handler.Frame); lastException = ex; Top.InstructionPointer = handler.InstructionPointer; }