ข้อยกเว้นและสาเหตุของพวกเขาอยู่เสมอเพียง 1: สิ่งที่ 1: คุณสามารถโยนหนึ่งข้อยกเว้นและแต่ละข้อยกเว้นสามารถมีได้เพียงหนึ่งสาเหตุ (ซึ่งสามารถมีสาเหตุได้อีก ...
ซึ่งอาจถือได้ว่าเป็นความผิดพลาดในการออกแบบโดยเฉพาะเมื่อพิจารณาถึงพฤติกรรมแบบมัลติเธรดตามที่คุณอธิบายไว้
นั่นเป็นหนึ่งในเหตุผลที่เพิ่ม Java 7 addSuppressed
ใน Throwable ซึ่งโดยทั่วไปสามารถแนบข้อยกเว้นจำนวนหนึ่งเข้ากับอีกอันหนึ่ง (แรงจูงใจหลักอื่น ๆ คือลองกับทรัพยากรที่ต้องการวิธีจัดการข้อยกเว้นในบล็อกในที่สุด พวกเขา)
ดังนั้นโดยทั่วไปเมื่อคุณมีข้อยกเว้น 1 ข้อที่ทำให้กระบวนการของคุณล้มเหลวคุณเพิ่มหนึ่งข้อนั้นเป็นสาเหตุของข้อยกเว้นระดับที่สูงกว่าของคุณและถ้าคุณมีมากกว่านั้นคุณจะเพิ่มสิ่งเหล่านั้นลงในต้นฉบับโดยใช้ addSuppressed
ข้อยกเว้นที่ทำให้เกิดกระบวนการของคุณล้มเหลวคุณเพิ่มที่หนึ่งเป็นสาเหตุของการยกเว้นระดับสูงของคุณและถ้าหากคุณมีมากขึ้นแล้วคุณเพิ่มเหล่านั้นไปยังคนเดิมใช้ แนวคิดก็คือข้อยกเว้นแรกคือ "แทนที่" คนอื่น ๆ กลายเป็นสมาชิกของ "ห่วงโซ่การยกเว้นจริง"
รหัสตัวอย่าง:
Exception exception = null;
for (Foobar foobar : foobars) {
try {
foobar.frobnicate();
} catch (Exception ex) {
if (exception == null) {
exception = ex;
} else {
exception.addSuppressed(ex);
}
}
}
if (exception != null) {
throw new SomethingWentWrongException(exception);
}
AggregateException
มีรายการข้อยกเว้นอยู่ แนวคิดนั้นควรนำไปใช้กับ Java ได้เช่นกัน