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。
答案 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)
将CoreHourXception
和NormalHourException
合并到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中是不可能的...以及我遇到的所有其他编程语言。
基本上,只能抛出一个异常并且可以一次传播,因此只能捕获一个异常。
如果您希望代码报告所有失败,那么您需要执行以下操作:
然后,您可以捕获异常,并处理它正在报告的(可能)多个错误条件。
繁琐?是!