يُستخدم في Java 8 نمط CompletableFuture
لإدارة العمليات الغير متزامنة بشكل مماثل لـListenableFuture
في Guava، وذلك عن طريق استخدام thenAccept()
لتحديد الإجراء الذي يجب تنفيذه عند اكتمال العملية بنجاح، و exceptionally()
لتحديد الإجراء الذي يجب تنفيذه في حالة حدوث استثناء.
في مثالك، تستخدم thenAccept()
بشكل صحيح لتحديد كيفية معالجة النتيجة بعد اكتمال العملية بنجاح، ولكن تواجه مشكلة مع exceptionally()
حيث يجب عليها إرجاع قيمة String
، وهو شيء غير مرغوب فيه في حالات الأخطاء.
بدلاً من إرجاع قيمة null
، يمكنك استخدام CompletableFuture
بشكل أكثر تحكمًا عن طريق تغيير استراتيجية التعامل مع الأخطاء. على سبيل المثال، يمكنك إلقاء استثناء من نوع RuntimeException
في حالة حدوث خطأ غير متوقع، كما في المثال التالي:
javaCompletableFuture future = CompletableFuture.supplyAsync(...)
.thenAccept(this::handleResult)
.exceptionally((t) -> {
log.error("Unexpected error", t);
throw new RuntimeException("Unexpected error occurred", t);
});
بهذه الطريقة، ستتم معالجة الخطأ وتسجيله بشكل مناسب دون الحاجة إلى إرجاع قيمة String
غير معنوية.
المزيد من المعلومات
يمكنك استخدام exceptionally()
بشكل أكثر تعقيدًا لتحقيق ما تريد بدلاً من إرجاع قيمة غير معنوية. على سبيل المثال، يمكنك استخدامها لإعادة إطلاق الاستثناء مع بناء أو تعديل الرسالة التي يتم إرجاعها، كما في المثال التالي:
javaCompletableFuture future = CompletableFuture.supplyAsync(...)
.thenAccept(this::handleResult)
.exceptionally((t) -> {
log.error("Unexpected error", t);
throw new CompletionException(new IllegalStateException("Unexpected error occurred", t));
});
هذا يضمن أن الاستثناء الذي يتم إلقاؤه يحتوي على الرسالة والسبب الأصلي للخطأ، مما يسهل فهم وتتبع الأخطاء في التطبيق الخاص بك.
وبصرف النظر عن ذلك، يمكنك أيضًا استخدام exceptionally()
لتنفيذ سلوك مخصص في حالة الخطأ، مثل تسجيل الخطأ في مكان ما أو تنفيذ إجراء معين، دون الحاجة إلى إرجاع قيمة.