捕获多个异常

时间:2015-08-17 07:25:57

标签: java exception-handling

public class OfficeTimeXception {
    public int inTime;
    public int outTime;

    public void anyXception() throws CoreHourXception, NormalHourException {
        int k = outTime - inTime;

        if (inTime > 11) {
            throw new CoreHourXception(inTime - 11);
        }
        if (k < 8) {
            throw new NormalHourException(8 + (inTime - outTime));
        } else if (outTime < 16) {
            throw new CoreHourXception(16 - outTime);
        }
    }
if my try & catch statement is 


    {test.inTime = 12;
        test.outTime = 19;
        try {
            test.anyXception();
        }

        catch (CoreHourXception e) {
            System.out.println("core hour exception by" + e.getTime()
                    + " hours");
            e.printStackTrace();
        } catch (NormalHourException e) {
            System.out.println("normal hour exception by" + e.getTime()
                    + " hours");
            e.printStackTrace();
        }}

当两个条件都失败时,我需要捕获两个异常....但即使两个条件都失败,我也只能获得coreHourException。

3 个答案:

答案 0 :(得分:2)

您一次只能抛出一个异常,并且当您这样做时,代码执行会立即停止(以后的验证根本不会运行)。

如果要检查多个错误并立即返回所有结果,则必须收集Collection中的验证错误并返回该Collection(例如,将其附加到包装器Exception)。

例如

List<Exception> errors = new List<>();
if (errorConditionOne) errors.add(new CoreHourXception());
if (errorConditionTwo) errors.add(new SomeOtherException(123, "abc"));
if (!errors.isEmpty) throw new ValidationException(errors);

您在错误集合中放置的这些对象本身不必是异常对象,它们可以是您方便传达信息的任何对象。

答案 1 :(得分:1)

CoreHourXceptionNormalHourException合并到HoreException,报告违反了哪些条件:

public class HourException extends Exception {
    private boolean normalViolated_;
    private boolean coreViolated_;

    public HourException(String message, boolean normalViolated, boolean coreViolated) {
         super(message);
         normalViolated_ = normalViolated;
         coreViolated_ = coreViolated;
    }

    public boolean isCoreViolated() {
         return coreViolated_;
    }

    public boolean isNormalViolated() {
         return normalViolated_;
    }
}

这与Stephen C的解决方案类似。但是,不是存储多个消息字符串(任何异常处理程序都无法轻松评估),而是显式存储有关违反约束的信息。

答案 2 :(得分:0)

  

当两个条件都失败时,我需要捕获两个异常....

这在Java中是不可能的...以及我遇到的所有其他编程语言。

基本上,只能抛出一个异常并且可以一次传播,因此只能捕获一个异常。

如果您希望代码报告所有失败,那么您需要执行以下操作:

  1. 创建一个空的消息列表。
  2. 一次检查一个条件。如果条件&#34;失败&#34;,则将错误消息添加到列表中。
  3. 检查完所有条件后,查看列表是否为空。如果是,那么EITHER将消息列表转换为字符串并使用该字符串抛出异常作为消息或使用列表字段抛出异常,通过构造函数参数将列表传递给异常。
  4. 然后,您可以捕获异常,并处理它正在报告的(可能)多个错误条件。

    繁琐?是!