[ https://issues.apache.org/jira/browse/MYFACES-3199?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13059436#comment-13059436 ]
Martin Kočí commented on MYFACES-3199: -------------------------------------- > 2a) exception is instance of APE _or any of the causes of the exception are > an APE, don't_ publish > ExceptionQueuedEvent and terminate processing for current event _(is this as > such in the spec that an APE has to be queued?)_ Good question. A) from specification document "6.2.1 Default ExceptionHandler implementation" - " ... upon encountering the first such Exception that is not an instance of javax.faces.event.AbortProcessingException ... " B) from JavaDoc Application.publishEvent : "... invoking the processListener method causes an javax.faces.event.AbortProcessingException to be thrown, processing of the listeners must be aborted, no further processing of the listeners for this event must take place, and the exception must be logged with Level.SEVERE" And that's all - specification is pretty poor in this area. ad A) this part expects AbortProcessingException to be queued for exception handler: but it does not make sense: AbortProcessingException is exception for controlling code flow and user can use it in same way as ValidatorException and ConverterException - those exceptions are not published. ad B) "exception must be logged with Level.SEVERE" no mention of publish but still weird: again, I think AbortProcessingException is expected exception - why logging it as severe ( funny: specification speaks about java.util.logging API directly) So, I completely agree with improved 2a) "exception is instance of APE or any of the causes of the exception are an APE, DON'T publish ExceptionQueuedEvent and terminate processing for current event". We should do a logging improvement here; if APE terminates processing for current event, output a log "Processing of .. was terminated with APE ..." but surely log level according to project stage (not severe) - I'll create separate subtask of MYFACES-3053 for it. > Handling AbortProcessingException is unconsistent > ------------------------------------------------- > > Key: MYFACES-3199 > URL: https://issues.apache.org/jira/browse/MYFACES-3199 > Project: MyFaces Core > Issue Type: Sub-task > Components: General > Environment: myface core trunk > Reporter: Martin Kočí > > UIViewRoot: > try { > source.broadcast(event); > } > catch (AbortProcessingException e) > { > ExceptionQueuedEventContext exceptionContext > = new ExceptionQueuedEventContext(context, e, source, > context.getCurrentPhaseId()); > context.getApplication().publishEvent(context, > ExceptionQueuedEvent.class, exceptionContext); > > // Abortion > return false; > } > Problem 1: > <h:inputText valueChangeListener="#{bean.processValueChange}"> > MethodExpressionValueChangeListener wraps all exceptions to > AbortProcessingException and therefore exception is queued > Problem 2: > <h:inputText > > <f:valueChangeListener binding="#{bean}" /> > </h:inputText> > ValueChangeListenerHandler does not wrap exception to > AbortProcessingException and therefore exception is not queued in this block > (but it is queued from phase executor but without component info) > Problem 3: JSF spec 2.1 : > "Clarification made: throwing an AbortProcessingException tells an > implementation that no further broadcast of the > current event occurs. Does not affect future events." > But I think that code in UIViewRoot makes opposite: // Abortion return > false; -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira