Java ExceptionHandler весь класс - PullRequest
1 голос
/ 29 мая 2020

Есть ли способ установить ExceptionHandler для класса и Exceptionclass? У меня есть такой класс:

public class MyServiceClass {

    public void foo() {
        //some Code... 
        throw new MyCustomRuntimeException();
        //some more Code... 
    }

    public void foo2() {
        //some other Code... 
        throw new MyCustomRuntimeException();
        //more other Code... 
    }
}

Теперь я хотел бы определить MyCustomRuntimeException - Handler примерно так:

private void exceptionHandler(MyCustomRuntimeException ex) {
    //some Magic
}

Который должен использоваться каждый раз, когда в этом возникает MyCustomRuntimeException. класс. Я знаю, что могу использовать try, catch, наконец, в каждом методе, но есть ли решение для всего класса? Хотел бы пропустить шаблон

try {
...
} catch (MyCustomRuntimeException ex) {
    exceptionHandler(ex);
}

Я использую Spring в этом приложении (без Spring Boot), но я ничего не нашел, как использовать @ExceptionHandler для простого Spring. Я пробовал следующее (не работает):

EasyApplication

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class EasyApplication {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(MyConfiguration.class);
        FooBar foo = context.getBean(FooBar.class);
        foo.doException();
    }
}

FooBar

import org.springframework.web.bind.annotation.ExceptionHandler;

public class FooBar {

    public void doException() {
        throw new RuntimeException();
    }

     @ExceptionHandler(value = RuntimeException.class)
     public void conflict() {
         System.out.println("Exception handled!");
     }
}

MyConfiguration

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyConfiguration {

    @Bean(name = "FooBar")
    public FooBar fooBar() {
        return new FooBar();
    }
}

1 Ответ

1 голос
/ 29 мая 2020

Если вы не используете spring- mvc и не находитесь в многопоточной среде, вы сможете хорошо справиться со следующим:

public class ExceptionHandler implements Thread.UncaughtExceptionHandler {

    public void uncaughtException(Thread t, Throwable e) {
        System.out.println("This is from the uncaught");
    }

}

А затем добавьте эту строку в свой main метод. Это работает для небольших приложений, и Spring играет здесь минимальную роль.

Thread.currentThread().setUncaughtExceptionHandler(new ExceptionHandler());

Если у вас более крупное приложение и вам нужно более элегантное решение, попробуйте ввести аспекты (AOP) в свое приложение.

Отредактировано 2 июня 2020 г.


Это когда используется пружина- mvc

Вы можете использовать @ExceptionHandler для этого. Spring Tutorial

@ExceptionHandler может обрабатывать как специфицированные c классы, так и глобальные обработчики (через @ControllerAdvice)

Специфические c обработчики класса запускаются раньше глобальные обработчики. Поэтому лучше всего использовать RuntimeException и Exception в глобальных обработчиках вместо того, чтобы использовать их в отдельных классах. Еще больше уменьшает шаблонный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...