关于spring:如何在java中完成多个异常处理?

How is multiple exception handling done in java?

本问题已经有最佳答案,请猛点这里访问。

我有下面的代码,在我的弹簧靴应用程序。这段代码进行电子邮件验证,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class EmailValidation {

    public static void validate(List<String> s){
        try {
            for (String address : s) {
                if (s == null || s.indexOf("@") < 0) {  
                    throw new InvalidEmailAddressException("Email address is invalid");
                }
                new InternetAddress(s);
            }
        } catch(AddressException e){
            LOGGER.Error("Please validate email addresses");
        }
    }
}

class InvalidEmailAddressException extends RuntimeException {

    public InvalidEmailAddressException(String message) {
        super(message)
    }
}

我的问题是如何捕获InvalidEmailAddressException?如何实现它来处理这段代码本身中的异常,以及调用方将如何处理异常?


使用multi-catch块,如下所示:

1
2
3
4
5
try {
  stuff
} catch (AddressException | InvalidEmailAddressException ex) {
  handle exception
}

首先,我认为从runtimeexception扩展是不好的实践,那个异常意味着程序崩溃,您应该从异常扩展。我认为你应该多读一些Java中的异常。如果您的方法没有捕获异常,您应该在方法签名中放入该方法引发特定异常的方法,例如:

公共静态void validate(list s)引发InvalidEmailAddressException{…}然后做这个:

类InvalidEmailAddressException扩展异常{public invalidemailAddressException(字符串消息){超级(消息)}

那个catch方法,关于addressException,这里没有它的定义,我认为如果您希望这个继续进行到调用者,您根本不应该捕捉它,只需要在throw中声明。


作为snakeyhips答案的替代方案,您可以单独提供几个catch块,例如

1
2
3
4
5
6
7
try {
    // do what you have to do here
} catch (AddressException) {
    LOGGER.Error("AddressException thrown");
} catch (InvalidEmailAddressException ex) {
    LOGGER.Error("InvalidEmailAddressException thrown");
}

异常有两种类型:选中、未选中。InvalidEmailAddressException扩展RuntimeException,这是不应捕获的未选中异常,因此最好从异常类扩展它。


snakeyhips的答案是可靠的,但要注意,您将无法对不同的异常做出不同的反应。

1
2
3
4
5
6
7
try {
   //your code
} catch (AddressException e1) {
  //handle this exception
} catch (InvalidAdressException e2) {
  //handle this exception
}

这将使您能够以不同的方式处理异常。如果您不关心这一点,您也可以捕获一般的异常类:

1
2
3
4
5
try {
   //your code
} catch (Exception e) {
   //handle exception
}