internal override void throwException(UserExceptionFactory factory) { Debug.Assert(_current == null); push(SliceType.ExceptionSlice); // // Read the first slice header. // startSlice(); string mostDerivedId = _current.typeId; while(true) { Ice.UserException userEx = null; // // Use a factory if one was provided. // if(factory != null) { try { factory(_current.typeId); } catch(Ice.UserException ex) { userEx = ex; } } if(userEx == null) { userEx = _stream.createUserException(_current.typeId); } // // We found the exception. // if(userEx != null) { userEx.read__(_stream); throw userEx; // Never reached. } // // Slice off what we don't understand. // skipSlice(); if((_current.sliceFlags & Protocol.FLAG_IS_LAST_SLICE) != 0) { if(mostDerivedId.StartsWith("::", StringComparison.Ordinal)) { throw new Ice.UnknownUserException(mostDerivedId.Substring(2)); } else { throw new Ice.UnknownUserException(mostDerivedId); } } startSlice(); } }
internal abstract void throwException(UserExceptionFactory factory);
internal override void throwException(UserExceptionFactory factory) { Debug.Assert(_sliceType == SliceType.NoSlice); // // User exception with the 1.0 encoding start with a bool flag // that indicates whether or not the exception has classes. // // This allows reading the pending instances even if some part of // the exception was sliced. // bool usesClasses = _stream.readBool(); _sliceType = SliceType.ExceptionSlice; _skipFirstSlice = false; // // Read the first slice header. // startSlice(); string mostDerivedId = _typeId; while(true) { Ice.UserException userEx = null; // // Use a factory if one was provided. // if(factory != null) { try { factory(_typeId); } catch(Ice.UserException ex) { userEx = ex; } } if(userEx == null) { userEx = _stream.createUserException(_typeId); } // // We found the exception. // if(userEx != null) { userEx.read__(_stream); if(usesClasses) { readPendingValues(); } throw userEx; // Never reached. } // // Slice off what we don't understand. // skipSlice(); try { startSlice(); } catch(Ice.UnmarshalOutOfBoundsException ex) { // // An oversight in the 1.0 encoding means there is no marker to indicate // the last slice of an exception. As a result, we just try to read the // next type ID, which raises UnmarshalOutOfBoundsException when the // input buffer underflows. // // Set the reason member to a more helpful message. // ex.reason = "unknown exception type `" + mostDerivedId + "'"; throw; } } }
/// <summary> /// Extracts a user exception from the stream and throws it. /// </summary> /// <param name="factory">The user exception factory, or null to use the stream's default behavior.</param> public void throwException(UserExceptionFactory factory) { initEncaps(); _encapsStack.decoder.throwException(factory); }