البرمجة

كيفية تنفيذ استثناء في CompletableFuture

يُستخدم في Java 8 نمط CompletableFuture لإدارة العمليات الغير متزامنة بشكل مماثل لـListenableFuture في Guava، وذلك عن طريق استخدام thenAccept() لتحديد الإجراء الذي يجب تنفيذه عند اكتمال العملية بنجاح، و exceptionally() لتحديد الإجراء الذي يجب تنفيذه في حالة حدوث استثناء.

في مثالك، تستخدم thenAccept() بشكل صحيح لتحديد كيفية معالجة النتيجة بعد اكتمال العملية بنجاح، ولكن تواجه مشكلة مع exceptionally() حيث يجب عليها إرجاع قيمة String، وهو شيء غير مرغوب فيه في حالات الأخطاء.

بدلاً من إرجاع قيمة null، يمكنك استخدام CompletableFuture بشكل أكثر تحكمًا عن طريق تغيير استراتيجية التعامل مع الأخطاء. على سبيل المثال، يمكنك إلقاء استثناء من نوع RuntimeException في حالة حدوث خطأ غير متوقع، كما في المثال التالي:

java
CompletableFuture future = CompletableFuture.supplyAsync(...) .thenAccept(this::handleResult) .exceptionally((t) -> { log.error("Unexpected error", t); throw new RuntimeException("Unexpected error occurred", t); });

بهذه الطريقة، ستتم معالجة الخطأ وتسجيله بشكل مناسب دون الحاجة إلى إرجاع قيمة String غير معنوية.

المزيد من المعلومات

يمكنك استخدام exceptionally() بشكل أكثر تعقيدًا لتحقيق ما تريد بدلاً من إرجاع قيمة غير معنوية. على سبيل المثال، يمكنك استخدامها لإعادة إطلاق الاستثناء مع بناء أو تعديل الرسالة التي يتم إرجاعها، كما في المثال التالي:

java
CompletableFuture future = CompletableFuture.supplyAsync(...) .thenAccept(this::handleResult) .exceptionally((t) -> { log.error("Unexpected error", t); throw new CompletionException(new IllegalStateException("Unexpected error occurred", t)); });

هذا يضمن أن الاستثناء الذي يتم إلقاؤه يحتوي على الرسالة والسبب الأصلي للخطأ، مما يسهل فهم وتتبع الأخطاء في التطبيق الخاص بك.

وبصرف النظر عن ذلك، يمكنك أيضًا استخدام exceptionally() لتنفيذ سلوك مخصص في حالة الخطأ، مثل تسجيل الخطأ في مكان ما أو تنفيذ إجراء معين، دون الحاجة إلى إرجاع قيمة.

زر الذهاب إلى الأعلى