Agreed. Scala has a notion of non fatal exceptions which basically matches
this.

On Wed, Oct 28, 2020 at 19:32 Ralph Goers <ralph.go...@dslextreme.com>
wrote:

> You might as well catch Throwable. You can’t really handle out of memory
> errors - the JVM won’t let you. As for StackOverflowError - yes, that
> should be handled. We don’t want the application to fail due to a buggy
> logging plugin.
>
> Ralph
>
> > On Oct 28, 2020, at 2:17 PM, Gary Gregory <garydgreg...@gmail.com>
> wrote:
> >
> > Hi, I am not sure it is wise to catch VM Errors like out of memory and
> > stack overflow Errors... any thoughts on those?
> >
> > Gary
> >
> > On Wed, Oct 28, 2020, 16:05 Volkan Yazıcı <volkan.yaz...@gmail.com>
> wrote:
> >
> >> Hello,
> >>
> >> While logging, we sometimes notice that the entire logging infra comes
> to a
> >> halt, even though the rest of the application still works perfectly
> fine. I
> >> have figured, appenders wrapped by AsyncAppender can throw a
> >> java.lang.Throwable that is not a subclass of java.lang.Exception and
> such
> >> an exception kills the AsyncAppender worker thread. Consider the
> following
> >> snippet from AsyncAppender.java in 2.x branch:
> >>
> >> boolean callAppenders(final LogEvent event) {
> >>    boolean success = false;
> >>    for (final AppenderControl control : appenders) {
> >>        try {
> >>            control.callAppender(event);
> >>            success = true;
> >>        } catch (final Exception ex) {
> >>            // If no appender is successful the error appender will get
> it.
> >>        }
> >>    }
> >>    return success;
> >> }
> >>
> >> Further, this is the relevant AppenderControl#tryCallAppender(LogEvent)
> >> method:
> >>
> >> private void tryCallAppender(final LogEvent event) {
> >>    try {
> >>        appender.append(event);
> >>    } catch (final RuntimeException ex) {
> >>        handleAppenderError(event, ex);
> >>    } catch (final Exception ex) {
> >>        handleAppenderError(event, new AppenderLoggingException(ex));
> >>    }
> >> }
> >>
> >> To avoid AsyncAppender.AsyncThread getting killed, I propose, in
> >> tryCallAppender(), replacing the java.lang.Exception catch clause with
> >> java.lang.Throwable instead. Objections? (If there are none, I will push
> >> this to both master and release-2.x branches with some unit tests.)
> >>
> >> To get some inspiration, I have checked the
> >> java.util.concurrent.ThreadPoolExecutor#runWorker() method:
> >>
> >> try {
> >>    task.run();
> >> } catch (RuntimeException x) {
> >>    thrown = x; throw x;
> >> } catch (Error x) {
> >>    thrown = x; throw x;
> >> } catch (Throwable x) {
> >>    thrown = x; throw new Error(x);
> >> }
> >>
> >> This is inline with the change I propose for tryCallAppender().
> >>
> >> For the records, the most frequent Throwable we encounter that is a
> super
> >> class of Exception is ExceptionInInitializerError, in case you are
> >> interested in.
> >>
> >> Kind regards.
> >>
>
>
>

Reply via email to