我有一个具有以下近似结构的Spring Boot应用程序:
Api
是interface
,如下所示:
public interface Api {
public String methodOne(...) throws ExceptionOne, ExceptionTwo, ExceptionThree;
...
public int methodN(...) throws ExceptionOne, ExceptionThree, ExceptionFour;
}
ApiImpls
是请求控制器(实际上有第二层,但这应该足以满足此示例)。在那里,我现在做了类似下面的事情:
@Controller
public class ApiImpl {
public String methodOne(...) {
try {
// do stuff that can yield an exception
}
catch(ExceptionOne e) {
// set proper response code and return values
}
catch(ExceptionTwo e) {
// set proper response code and return values
}
catch(ExceptionThree e) {
// set proper response code and return values
}
}
}
基本上,这种行为会产生重复的批次(可能也会将我的例外D,R和Y命名为......),但是非常适合处理内部应用程序逻辑。 / p>
我的问题是:如何实现一个可以在Java中处理此问题的自定义异常调度程序?理想情况下,我想要像this answer here这样的东西,但不幸的是只是throw
当前的异常,就像我知道的那样,Java中的C ++代码是不可能的。为简洁起见,我想要完成的事情如下:
@Controller
public class ApiImpl {
public String methodOne(...) {
try {
// do stuff that can yield an exception
}
catch(ExceptionOne e) {
handle()
}
}
private void handle() { // maybe Throwable or Exception subclass as parameter
// handle the correct exception type, set correct response code, etc.
}
}
有没有什么好方法可以做到这一点,以尽量减少代码重复?
这是我试图让这项工作的初步尝试:
public class Thrower {
public Thrower(int e) throws ExceptionOne, ExceptionTwo, ExceptionThree {
if(e == 0) {
throw new ExceptionOne();
}
if(e == 1) {
throw new ExceptionTwo();
}
if(e == 2) {
throw new ExceptionThree();
}
}
}
class ExceptionOne extends Exception {}
class ExceptionTwo extends Exception {}
class ExceptionThree extends Exception {}
public class ExceptionHandler {
private void handle(Exception ex) throws Exception {
try {
throw ex;
}
catch(ExceptionOne e) {
e.printStackTrace();
System.out.println("Exception one");
}
catch(ExceptionTwo e) {
e.printStackTrace();
System.out.println("Exception two");
}
catch(ExceptionThree e) {
e.printStackTrace();
System.out.println("Exception three");
}
}
public void causesException(int which) throws Throwable {
try {
Thrower t = new Thrower(which);
}
catch(Exception e) {
handle(e);
}
}
public static void main(String[] args) throws Throwable {
ExceptionHandler eh = new ExceptionHandler();
eh.causesException(0);
eh.causesException(1);
eh.causesException(2);
}
}
这按预期工作,我可以根据需要处理不同的异常类型(这里使用构造函数显示,但原理是相同的)。然而,这感觉非常笨重。
答案 0 :(得分:3)
如果您正在寻找全局处理所有控制器层异常(在Spring MVC架构中),您可以使用@ExceptionHandler
方法在一个位置为所有控制器(下面的 option1 )执行此操作这是来自Spring的ControllerAdvice
。
选项(1):在单独的类中配置例外
@ControllerAdvice
class MyProjectExceptionHandler {
@ExceptionHandler(value = ExceptionOne.class)
public R exceptionOne(ExceptionOne exe) {
//set proper response code and return values
}
@ExceptionHandler(value = ExceptionTwo.class)
public R exceptionTwo(ExceptionTwo exe) {
//set proper response code and return values
}
}
选项(2):在控制器类本身中配置例外
如果您正在寻找处理Controller
类本身中的异常,那么您可以按照以下方式执行此操作:
@Controller
public class ApiImpl {
public String methodOne(...) {
}
@ExceptionHandler(ExceptionOne.class)
public R exceptionTwo(ExceptionOne exe) {
//set proper response code and return values
}
//other exceptions
}
您可以在here
了解详情