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